簡體   English   中英

Django —常見方案:具有M2M的產品->類別。 如何有效地查詢產品查詢集中的所有類別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM