构建列表组合相关字段的最有效方法

时间:2016-01-26 06:41:31

标签: python django django-templates

我有两个模型:VendorProductVendor模型有state字段。我想创建一个页面,列出某个州的供应商,按产品分组。示例输出为:

  

马里兰州的供应商

     
      
  • 产品A      
        
    • 供应商1
    •   
  •   
  • 产品B      
        
    • 供应商2
    •   
    • 供应商3
    •   
  •   
  • 产品C.      
        
    • 供应商4
    •   
    • 供应商5
    •   
  •   

VendorsProduct作为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。理想情况下,我根本没有将产品显示在列表中。

所以,希望有足够的背景。我确定我错过了什么。任何帮助都是极好的。谢谢!

2 个答案:

答案 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 ForeignKeyModel,您应该在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}}