[英]Django — Common Scenario: Product with M2M -> Categories. How do I efficiently query all categories on a product queryset?
我正在努力減少查詢次數並提出問題。
我有一個典型的產品模型設置,可以有多個類別。
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
模型,我已經能夠對查詢(幻燈片)進行分區,並且僅使用2個查詢+ python,但是我似乎無法將其應用於M2M,因為當我提取我引用的類別時產品查詢集,我不知道哪個產品觸發了類別匹配。
我傾向於在我的模型上設置main_category
字段,該字段具有在M2MField更改信號時計算的類別ID。
謝謝你的時間 : )
這就是我要做的。 為ManyToMany關系創建through
模型,並在該模型上粘貼一個布爾字段以指示main_category
狀態。 然后,您可以使用select_related()
查詢該模型,以便它自動跟隨兩個外鍵 - 現在您可以遍歷貫穿對象並獲得Product和Category,而無需任何額外查詢。
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 %}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.