4

我的数据库具有以下架构:

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)

换句话说,aProduct有很多Tags,aProduct有很多AlternatePartNumbers。 Tags 是 的属性的集合Product

给定 a 中的三个属性Tag,我想选择Product匹配的关联 s(可能不止一个),以及AlternatePartNumber每个产品的所有 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 %}

这可以运行数千个查询,具体取决于匹配的数量。有没有好的方法来优化这个?我尝试使用Tag.objects.select_related().filter...并帮助了一些,但它没有足够的帮助。

4

1 回答 1

8

Product 和 AlternatePartNumber 之间的关系是反向 ForeignKey 关系,所以select_related()不会起作用。You need prefetch_related(),它比select_related()处理多对一关系的攻击性要小一些。

我自己之前没有使用过 prefetch_related() 但如果我正确阅读了文档,你需要类似Tag.objects.prefetch_related('product__alternatepartnumber_set').filter.... 如果这不起作用,请在 AlternatePartNumber 模型上指定一个 related_name 并使用它来代替alternatepartnumber_set.

于 2012-04-25T19:05:46.223 回答