我有两个模型:Vendor
,Product
。 Vendor
模型有state
字段。我想创建一个页面,列出某个州的供应商,按产品分组。示例输出为:
马里兰州的供应商
- 产品A
- 供应商1
- 产品B
- 供应商2
- 供应商3
- 产品C.
- 供应商4
- 供应商5
Vendors
将Product
作为ForeignKey
。我可以按州名搜索供应商。
def vendor_by_state_page(request, state_name):
vendors = Vendor.objects.filter(state=state_name)
products = Products.objects.all()
我可以在模板中做嵌套循环,但效果似乎很低:
{% for product in products %}
<h2>{{product.name}}</h2>
{% for vendor in vendors %}
{% if vendor.product == product %}
- {{vendor.display_name}}
{% endif %}
{% empty %}
No {{product.name}} vendors in {{state.name}}.
{% endfor %}
{% endfor %}
另外,空实际上并没有在这里工作,因为有结果,它们只是不匹配if。理想情况下,我根本没有将产品显示在列表中。
所以,希望有足够的背景。我确定我错过了什么。任何帮助都是极好的。谢谢!
答案 0 :(得分:2)
您需要使用预取来过滤相关集。
from django.db.models import Prefetch
products = Products.objects.prefetch_related(Prefetch(
'vendor_set',
queryset=Vendor.objects.filter(
state=state_name
)
))
在模板中迭代:
{% for product in products %}
<h2>{{product.name}}</h2>
{% for vendor in product.vendor_set.all %}
- {{vendor.display_name}}
{% empty %}
No {{product.name}} vendors in {{state.name}}.
{% endfor %}
{% endfor %}
答案 1 :(得分:0)
您可以尝试related_name
:
如果Vendor
Product
ForeignKey
为Model
,您应该在class Vendor(models.Model):
product = models.ForeignKey(Product,related_name="vendors")
中有类似内容:
{% for product in products %}
<h2>{{product.name}}</h2>
{% for vendor in product.vendors.all %}
- {{vendor.display_name}}
{% endfor %}
{% endfor %}
现在您将访问此类产品的供应商:
{{1}}