Django - 常见场景:具有M2M的产品 - >分类。如何有效地查询产品查询集上的所有类别?

时间:2010-12-04 05:08:19

标签: python django

我正在努力减少查询次数并提出问题。

我有一个典型的产品型号设置,可以有多个类别。

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个查询+ python,  但我似乎无法将其应用于M2M,因为当我拉出产品查询集中引用的类别时,我不知道哪个产品触发了类别匹配。

我倾向于在我的模型上设置main_category字段,只要有M2MField更改信号,就会计算出类别ID。

感谢您的时间:)

1 个答案:

答案 0 :(得分:2)

这就是我要做的。为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 %}