我的数据库有以下架构:
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)
换句话说,Product
有很多Tag
个,Product
有很多AlternatePartNumber
个。 Tag
是Product
。
鉴于Tag
中的三个属性,我想选择匹配的Product
匹配(可能多于一个),以及AlternatePartNumber
的所有# 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 %}
每个产品。
目前我这样做:
Tag.objects.select_related().filter...
这可以运行数千个查询,具体取决于匹配的数量。有没有一种优化方法?我尝试使用{{1}}并帮助了一些,但这没有用。
答案 0 :(得分:6)
Product与AlternatePartNumber之间的关系是反向ForeignKey关系,因此select_related()
将不起作用。您需要prefetch_related()
,这比select_related()
稍微不那么激进,但可以处理多对一关系。
我之前没有使用prefetch_related(),但如果我正确地阅读the documentation,则需要Tag.objects.prefetch_related('product__alternatepartnumber_set').filter...
之类的内容。如果这不起作用,请在AlternatePartNumber模型上指定related_name,并使用它而不是alternatepartnumber_set
。