Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Django ORM在没有数百个查询的情况下选择多对一对多?_Python_Django_Django Models_Query Optimization_Django Orm - Fatal编程技术网

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

Python 如何使用Django ORM在没有数百个查询的情况下选择多对一对多?,python,django,django-models,query-optimization,django-orm,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

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

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)
换句话说,
产品
有许多
标签
s,而
产品
有许多
备用零件号
s<代码>标签是产品属性的集合

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

这可以运行数千个查询,具体取决于匹配的数量。有没有一个好的方法来优化这一点?我尝试使用
标记.objects.select_related().filter…
,这对一些人有所帮助,但帮助还不够。

产品和AlternatePartNumber之间的关系是反向的ForeignKey关系,因此
select_related()
无法工作。您需要
prefetch\u related()
,这比
select\u related()
略逊一筹,但可以处理多对一关系


我自己以前没有使用过prefetch\u related(),但是如果我阅读正确,您需要类似于
标记.objects.prefetch\u related('product\uu alternativepartnumber\u set')。filter…
。如果这不起作用,请在AlternatePartNumber模型上指定一个相关的\u名称,并使用该名称而不是
AlternatePartNumber\u集

我必须添加相关的\u名称,但使用prefetch\u related大大减少了查询数量。多谢!