在Django中查找一组相关项

时间:2015-02-10 01:06:35

标签: django

在Django中,我使用以下代码从LocationImage模型获取与Location相关的图像。

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

如果该位置是一个区域,并且该区域没有图像,我希望能够仅为该区域的城市获取图像。

城市也是位置模型的一部分,区域字段设置为区域且related_name ='location_region'

关于如何做到这一点的任何想法?

例如,如果我的LocationImage模型中有一个区域字段,我将如何在区域字段中引用具有该区域ID的所有LocationImages的集合,而不是在主id字段中。

根据要求,型号:

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 ='city','region或'country'

1 个答案:

答案 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 %}