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

2024-10-06 11:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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的属性集合。

给定一个Tag中的三个属性,我想选择匹配的相关Products(可以是多个),以及每个产品的所有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...这对一些人有帮助,但效果不够。


Tags: modelmodelstagtagsproductfilterclasscharfield