2016-01-26 23 views
2

我有兩種模式:VendorProduct。該Vendor模型有一個state字段。我想創建一個頁面,列出某個州的供應商,按產品分組。實施例的輸出是:最有效的方法來建立列表結合相關領域

Vendors in Maryland

  • Product A
    • Vendor 1
  • Product B
    • Vendor 2
    • Vendor 3
  • Product C
    • Vendor 4
    • Vendor 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 %} 

此外,空實際上並不在這裏工作,因爲有結果,他們只是在不匹配的,如果。理想情況下,我根本沒有產品出現在名單上。

所以,希望這是足夠的背景。我確定我錯過了一些東西。任何幫助都是極好的。謝謝!

回答

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 %} 
+0

tomas-walch - 謝謝!這工作,但'prefetch(state = state_name)'給我一個錯誤:''經理'對象沒有屬性'prefetch'' ..所以我刪除它,所有的工作很好。如果供應商列表爲空,是否還有額外的我可以過濾產品不在列表中的位置? – Brenden

+1

只是我的一個錯字。我會編輯。 –

+0

謝謝。有幫助!關於完全隱藏結果/模板中沒有供應商的產品的任何想法? – Brenden

0

您可以related_name嘗試:

如果VendorProductForeignKey,你應該在你的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 %}