Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 结合相关字段构建列表的最有效方法_Python_Django_Django Templates - Fatal编程技术网

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'
。。所以我把它拿走了,一切都很好。如果供应商列表为空,是否有其他我可以筛选的产品不在列表中?谢谢。有帮助!对结果/模板完全隐藏没有供应商的产品有什么想法吗?是的,很简单。在
供应商\状态=状态\名称
上筛选产品查询集。