Django select 相关
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' object is not iterable.
我猜相关查询是错误的。
相关查询是错误的,但这不是导致您出错的原因。那是因为您需要使用 all()
或 filter()
的相关管理器,就像任何其他管理器一样。
{% for merchant in category.merchants.all %}
请注意,无论您是否在视图中执行任何特殊的相关查询,这都有效;此语法 始终 可用,并且 select_related
不 允许访问更多属性。它所做的只是让查询更有效率。
但是在你的情况下 select_related
甚至不是正确的使用方法;它不会有任何效果。那是因为它只适用于正向关系,而你有从类别到商家的反向关系。为此你需要 prefetch_related
。
categories = Category.objects.prefetch_related('merchants')
我想显示所有分类相关的商家和相关商家的图片。我怎样才能做到这一点?
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' object is not iterable.
我猜相关查询是错误的。
相关查询是错误的,但这不是导致您出错的原因。那是因为您需要使用 all()
或 filter()
的相关管理器,就像任何其他管理器一样。
{% for merchant in category.merchants.all %}
请注意,无论您是否在视图中执行任何特殊的相关查询,这都有效;此语法 始终 可用,并且 select_related
不 允许访问更多属性。它所做的只是让查询更有效率。
但是在你的情况下 select_related
甚至不是正确的使用方法;它不会有任何效果。那是因为它只适用于正向关系,而你有从类别到商家的反向关系。为此你需要 prefetch_related
。
categories = Category.objects.prefetch_related('merchants')