gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:05:03 24 4
gpt4 key购买 nike

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

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 s。 Tag s 是 Product 的属性集合.

给定 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...这对一些人有帮助,但还不够。

最佳答案

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 .

关于python - 如何使用 Django ORM 在没有数百个查询的情况下选择多对一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10322017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com