Python 如何使用Django ORM在没有数百个查询的情况下选择多对一对多?
我的数据库具有以下架构:Python 如何使用Django ORM在没有数百个查询的情况下选择多对一对多?,python,django,django-models,query-optimization,django-orm,Python,Django,Django Models,Query Optimization,Django Orm,我的数据库具有以下架构: class Product(models.Model): pass class Tag(models.Model): product = models.ForeignKey(Product) attr1 = models.CharField() attr2 = models.CharField() attr3 = models.CharField() class AlternatePartNumber(models.Model
class Product(models.Model):
pass
class Tag(models.Model):
product = models.ForeignKey(Product)
attr1 = models.CharField()
attr2 = models.CharField()
attr3 = models.CharField()
class AlternatePartNumber(models.Model):
product = models.ForeignKey(Product)
换句话说,产品
有许多标签
s,而产品
有许多备用零件号
s<代码>标签是产品属性的集合
给定标签中的三个属性
,我想选择匹配的关联产品
s(可能不止一个),以及每个产品的所有备选零件号
s
目前我这样做:
# views.py
results = Tag.objects.
filter(attr1=attr1).
filter(attr2=attr2).
filter(attr3=attr3)
# a template
{% for result in results %}
{% for alternate in result.product.alternatepartnumber_set.all %}
{{ alternate.property }}
{% endfor %}
{% endfor %}
这可以运行数千个查询,具体取决于匹配的数量。有没有一个好的方法来优化这一点?我尝试使用
标记.objects.select_related().filter…
,这对一些人有所帮助,但帮助还不够。产品和AlternatePartNumber之间的关系是反向的ForeignKey关系,因此select_related()
无法工作。您需要prefetch\u related()
,这比select\u related()
略逊一筹,但可以处理多对一关系
我自己以前没有使用过prefetch\u related(),但是如果我阅读正确,您需要类似于
标记.objects.prefetch\u related('product\uu alternativepartnumber\u set')。filter…
。如果这不起作用,请在AlternatePartNumber模型上指定一个相关的\u名称,并使用该名称而不是AlternatePartNumber\u集
我必须添加相关的\u名称,但使用prefetch\u related大大减少了查询数量。多谢!