我正在努力减少查询次数并提出问题。
我有一个典型的产品型号设置,可以有多个类别。
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。
感谢您的时间:)
答案 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 %}