Python 结合相关字段构建列表的最有效方法
我有两种型号:Python 结合相关字段构建列表的最有效方法,python,django,django-templates,Python,Django,Django Templates,我有两种型号:供应商,产品。供应商模型有一个状态字段。我想创建一个页面,列出处于特定状态的供应商,按产品分组。示例输出为: 马里兰州的供应商 产品A 供应商1 产品B 供应商2 供应商3 产品C 供应商4 供应商5 供应商将产品作为外键。我可以按州名称搜索供应商 def vendor_by_state_page(request, state_name): vendors = Vendor.objects.filter(state=state_name) produ
供应商
,产品
。供应商
模型有一个状态
字段。我想创建一个页面,列出处于特定状态的供应商,按产品分组。示例输出为:
马里兰州的供应商
- 产品A
- 供应商1
- 产品B
- 供应商2
- 供应商3
- 产品C
- 供应商4
- 供应商5
供应商
将产品
作为外键
。我可以按州名称搜索供应商
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 %}
{%用于产品中的产品%}
{{product.name}
{供应商%中供应商的%s}
{%if vendor.product==product%}
-{{vendor.display_name}
{%endif%}
{%empty%}
{{state.name}中没有{{product.name}供应商。
{%endfor%}
{%endfor%}
另外,这里的空值实际上不起作用,因为有结果,它们只是与if不匹配。理想的情况是,我根本不会让产品出现在清单上
所以,希望这是足够的背景。我肯定我错过了什么。任何帮助都会很棒。谢谢 您需要使用预取来过滤相关集
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 %}
{%用于产品中的产品%}
{{product.name}
{product.vendor\u set.all%中的供应商的%
-{{vendor.display_name}
{%empty%}
{{state.name}中没有{{product.name}供应商。
{%endfor%}
{%endfor%}
您可以尝试使用相关的\u名称
:
如果供应商
将产品
作为外键
,您的型号
中应该有类似的东西:
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 %}
{%用于产品中的产品%}
{{product.name}
{product.vendors.all%中供应商的%
-{{vendor.display_name}
{%endfor%}
{%endfor%}
tomas walch-谢谢!这是可行的,但是预回迁(state=state\u name)
给了我一个错误:'Manager'对象没有属性'prefetch'
。。所以我把它拿走了,一切都很好。如果供应商列表为空,是否有其他我可以筛选的产品不在列表中?谢谢。有帮助!对结果/模板完全隐藏没有供应商的产品有什么想法吗?是的,很简单。在供应商\状态=状态\名称
上筛选产品查询集。