如何选择多对一对多无需数百使用Django ORM疑问?(How to select many to

2019-09-16 18:39发布

我的数据库有以下模式:

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 S和一个Product有很多AlternatePartNumber秒。 Tag s为的属性的集合Product

鉴于在三个属性Tag ,我想选择相关的Product相匹配的S(可能不止一个),以及所有的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...而且帮助一些,但它并没有帮助不够。

Answer 1:

产品和AlternatePartNumber之间的关系是反向ForeignKey的关系,所以select_related()将无法工作。 你不必prefetch_related()这是比少一点侵略性select_related()但可以处理许多一对一的关系。

我没有用之前prefetch_related()自己,但如果我读的文件正确,你需要像Tag.objects.prefetch_related('product__alternatepartnumber_set').filter... 。 如果还是不行,请指定在AlternatePartNumber模型related_name并使用它的alternatepartnumber_set



文章来源: How to select many to one to many without hundreds of queries using Django ORM?