Python Django中复杂多模型查询的优化

Python Django中复杂多模型查询的优化,python,django,django-models,many-to-many,django-orm,Python,Django,Django Models,Many To Many,Django Orm,我需要一个什么样的产品显示在哪个网站上容易控制,因为有很多产品,我也想通过类别,生产者和标签设置产品的网站。因此,如果产品或(其类别、生产商及其标签之一)链接到站点,我会在站点上显示产品。我最后得到的代码如下(简化): 我的问题是如何优化get\u站点方法?可以加入一些查询吗 更新:我只对搜索引擎将索引和存储的站点ID感兴趣。如果可能的话,你应该尝试在数据库级别上做你想做的一切。像这样的事情应该让你开始 from django.db.models import Sum self.objects

我需要一个什么样的产品显示在哪个网站上容易控制,因为有很多产品,我也想通过类别,生产者和标签设置产品的网站。因此,如果产品或(其类别、生产商及其标签之一)链接到站点,我会在站点上显示产品。我最后得到的代码如下(简化):

我的问题是如何优化
get\u站点
方法?可以加入一些查询吗



更新:我只对搜索引擎将索引和存储的站点ID感兴趣。

如果可能的话,你应该尝试在数据库级别上做你想做的一切。像这样的事情应该让你开始

from django.db.models import Sum
self.objects.select_related("producer__sites",
                            "category__sites",
                            "tags__sites",
                            "sites").annotate(tag_count=Sum("tags__sites__id"))
select_related
返回
产品
模型,并填充生产者、类别、标签和站点引用。这还包括生产者、类别和标签中的
站点
参考。这使得Django对数据库的查询更少

annotate
向返回的名为
tag\u count
Model
实例中添加一个属性,该实例中包含tags\u sites\u id的总和


Django可能是一个很好的帮助,因为我不知道您想要返回的内容的确切性质。

是的,您可以使用
select\u related
和/或
prefetch\u related
减少Django中的查询数量


但是,
select\u related
仅适用于外键和一对一关系。因为您的产品模型中有很多,所以您应该使用来减少在Product.get_sites()中的查询。

谢谢!我只需要站点ID。不幸的是,Sum aggregator在这里帮不了我,因为我需要收集站点ID。我需要运行更多查询(例如@pram提到的
prefetch\u相关的
)。
from django.db.models import Sum
self.objects.select_related("producer__sites",
                            "category__sites",
                            "tags__sites",
                            "sites").annotate(tag_count=Sum("tags__sites__id"))