如何在没有使用Django ORM的数百个查询的情况下选择多对一到多个?

时间:2012-04-25 18:54:57

标签: 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):
    product = models.ForeignKey(Product)

换句话说,Product有很多Tag个,Product有很多AlternatePartNumber个。 TagProduct

的属性集合

鉴于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}}并帮助了一些,但这没有用。

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