2010-12-04 20 views
0

我想減少我的查詢計數,並有一個問題。Django - 常見情景:產品與M2M - >類別。如何有效地查詢產品查詢集上的所有類別?

我有一個典型的產品模型,可以有多個類別。

Product M2M -> Category

我定義的函數,拉主目錄(讓剛剛說其最新的一個):

class Category(models.Model): 
    name = models.CharField(max_length=1) 

class Product(models.Model): 
    category = models.ManyToManyField(Category) 

    def main_category(self): 
     return self.category.latest('id') 
     # or any other way to determine main category 

我通過產品在我的模板迭代,顯示它的主要類別。

{% for product in products %} 
    Name: {{ product.name }} 
    Category: {{ product.main_category }} 
{% endfor %} 

這會導致對每個產品的查詢。我如何在Python中用更少的查詢來獲得它?

對於我的其他MultipleObjectFK -> Product車型我已經能夠partition my queries (slideshow)和只使用2 +查詢蟒蛇, 但我似乎無法將它應用於M2M,因爲當我拉了在我的產品的查詢集引用的類別,我不知道哪個產品觸發了類別匹配。

我傾向於在我的模型上設置一個main_category字段,該字段在有M2MField更改信號時計算出類別ID。

感謝您的時間:)

回答

2

這就是我會做。爲ManyToMany關係創建一個through模型,並在該模型上粘貼布爾型字段以指示main_category狀態。然後,您可以使用select_related()查詢該模型,以便它自動跟隨兩個外鍵 - 現在,您可以迭代通過對象並獲取產品和類別,而無需任何額外的查詢。

class Product(models.Model): 
    category = models.ManyToManyField(Category, through="ProductCategory") 

class ProductCategory(models.Model): 
    product = models.ForeignKey(Product) 
    category = models.ForeignKey(Category) 
    main = models.BooleanField(default=False) 

查看:

prod_cats = ProductCategory.objects.filter(main=True).select_related() 

模板:

{% for prod_cat in prod_cats %} 
    Name: {{ prod_cat.product.name }} 
    Category: {{ prod_cat.category.name }} 
{% endfor %} 
+0

真的很有趣使用的 「通過」 的模式,我會記住這下一次。謝謝! – 2010-12-04 11:06:45

相關問題