提高Django ORM的性能

提高Django ORM的性能,django,orm,Django,Orm,我想返回超过25个like和500个最近内容的内容。 这是可行的,但是还有其他方法可以提高性能吗?您已经可以在数据库端进行筛选了。这将阻止对.prefetch\u相关(…)进行额外查询,但也会限制用于传输数据的带宽: contents = Content.objects.filter( is_excluded=False ).prefetch_related('comments', 'likes', 'dislikes').order_by('-id').all()[:500] r

我想返回超过25个like和500个最近内容的内容。

这是可行的,但是还有其他方法可以提高性能吗?

您已经可以在数据库端进行筛选了。这将阻止对
.prefetch\u相关(…)
进行额外查询,但也会限制用于传输数据的带宽:

contents = Content.objects.filter(   
    is_excluded=False
).prefetch_related('comments', 'likes', 'dislikes').order_by('-id').all()[:500]
result = [(v, len(v.comments.all())) for v in contents if len(v.likes.all()) -len(v.dislikes.all()) > 24][:7]
这里是必要的,因为有两个
连接
s,并且没有唯一性过滤器,因此这两个聚合将充当彼此的乘法器


话虽如此,我不确定有两个相关的好恶模型是否是个好主意。为什么不制作一个模型(比如
Thumb
),其中值
+1
表示相似,值
-1
表示不喜欢。它使建模更加简单,因此您可以使用a来代替。

谢谢。但这很复杂,因为我使用预取相关的代码和其他代码。我编辑我的代码。你能看一下吗?@hyongjim:你仍然可以在这个查询集中使用
.prefetch\u related
。但您不必为了过滤目的而这样做。
from django.db.models import Count

contents = Content.objects.annotate(
    nlikes=Count('likes')
).filter(
    is_excluded=False,
    nlikes__gt=24
).order_by('-id')[:500]
from django.db.models import Count, Value
from django.db.models.functions import Coalesce

contents = Content.objects.annotate(
    nlikes=Coalesce(Count('likes', distinct=True), Value(0))-Coalesce(Count('dislikes', distinct=True), Value(0))
).filter(
    is_excluded=False,
    nlikes__gt=24
).order_by('-id')[:500]