Django选择相关

时间:2016-05-20 11:58:31

标签: python django django-select-related

我想显示与相关商家和相关商家图像的所有类别。我怎样才能做到这一点?

models.py

class Category(models.Model):
    title = models.CharField(max_length = 50)
    class Meta:
        verbose_name_plural = 'Categories'

class Merchant(models.Model):
    category = models.ForeignKey('Category', related_name = 'merchants', blank = True, null = True)
    title = models.CharField(max_length = 100)

class StoredFile(models.Model):
    merchant = models.OneToOneField(Merchant, related_name="_image", blank = True, null = True)

views.py

categories = Category.objects.select_related()

的index.html

{% for category in categories %}
    {{ category.title }}
    {% for merchant in category.merchants  %}
        {{ merchant.name }}
        {{ merchant.image.url }}
    {% endfor %}
{% endfor %}

我的代码无效。

  

' RelatedManager'对象不可迭代。

我猜相关查询是错误的。

1 个答案:

答案 0 :(得分:1)

相关查询 错误,但这不是导致错误的原因。这是因为您需要使用all()filter()的相关经理,就像其他任何经理一样。

{% for merchant in category.merchants.all %}

请注意,无论您是否在视图中执行任何特殊相关查询,此方法都有效;此语法始终可用,而select_related 可以访问更多属性。它所做的就是提高查询效率。

但是在你的情况下,select_related甚至不是正确的用法;它没有任何效果。这是因为它只适用于前向关系,而且你有从类别到商家的反向关系。你需要prefetch_related

categories = Category.objects.prefetch_related('merchants')