2015-02-10 3 views
0

В Django я использую следующий код для получения изображений, связанных с местоположением, из модели LocationImage.Поиск набора связанных элементов в Django

{% for location in locations %} 
{% for image in location.locationimage_set.all %} 
etc 

Если это место является регионом, и нет никаких изображений для данного региона, я хочу, чтобы иметь возможность получить изображения для городов в этом регионе, по-прежнему имея в виду только этот регион.

города также являются частью модели местоположения, с полем области, установленным в регионе и related_name = «location_region»

Любые идеи о том, как это сделать?

Например, если бы у меня было поле области в моей модели LocationImage, как бы я мог ссылаться на набор всех LocationImages с этим идентификатором региона в поле области, а не в поле основного идентификатора.

В соответствии с просьбой, модели:

class LocationImage(models.Model): 
    location = models.ForeignKey(Location) 
    imagelink = models.URLField(max_length=500, null=True) 

class Location(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=200, db_index=True, verbose_name="ascii name") 
    slug = models.SlugField(max_length=200) 
    locationtype = models.CharField(max_length=50) 
    region = models.ForeignKey('self', null=True, blank=True, related_name='location_region') 
    country = models.ForeignKey('self', null=True, blank=True, related_name='location_country') 

где locationtype = 'город', «регион или 'страна'

+1

Показать код модели. – catavaran

+0

Спасибо, добавлено ... –

ответ

3

Вы можете использовать {% for %} ... {% empty %} тег шаблона.

{% for location in locations %} 
    {% for image in location.locationimage_set.all %} 
     ... 
    {% empty %} 
     {# there is no images for `location` #} 
     {% ifequal location.locationtype 'region' %} 
      {% for city in location.location_region.all %} 
       {% for image in city.locationimage_set.all %} 
        ... 
       {% endfor %} 
      {% endfor %} 
     {% endifequal %} 
    {% endfor %} 
{% endfor %} 

Но я думаю, что это слишком сложный код шаблона. Может быть, будет лучше добавить метод get_images() к модели Location и реализовать эту логику в python?

class Location(models.Model): 

    def get_images(self): 
     images = self.locationimage_set.all() 
     if self.locationtype == 'region' and not images: 
      images = LocationImage.objects.filter(location__region=self) 
     return images 

Этот метод намного эффективнее, чем версия шаблона. И шаблон будет таким же простым, как:

{% for location in locations %} 
    {% for image in location.get_images %} 
     ... 
    {% endfor %} 
{% endfor %} 
+0

Спасибо, это здорово! Я пошел на метод get_images, и это сработало. Взял немного повторного отжимания моего кода, чтобы соответствовать, но это сработало хорошо! –

Смежные вопросы