gpt4 book ai didi

django - 提高 Django ORM 的性能

转载 作者:行者123 更新时间:2023-12-05 02:49:17 34 4
gpt4 key购买 nike

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]

我要返回超过25个赞和500个最近的内容。
这可行,但还有其他方法可以提高性能吗?

最佳答案

您已经可以在数据库端进行过滤。这将防止对 .prefetch_related(…) 进行额外查询,但也会限制用于传输数据的带宽:

from django.db.models import <b>Count</b>

contents = Content.objects.annotate(
<b>nlikes=Count('likes')</b>
).filter(
is_excluded=False,
<b>nlikes__gt=24</b>
).order_by('-id')[:500]

这样就得到了主键最高的500个Content点赞数超过24个

例如,您可以过滤 likesdislikes 之间的平衡:

from django.db.models import <b>Count, Value</b>
from django.db.models.functions import <b>Coalesce</b>

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

这里是 distinct=True [Django-doc]是必要的,因为有两个 JOIN,并且没有唯一性过滤器,因此这两个聚合将充当彼此的乘数

话虽这么说,但我不确定拥有两个相关的好恶模型是否是个好主意。为什么不制作一个模型(如 Thumb),其值 +1 表示喜欢,-1 表示不喜欢。它使建模变得更简单,从那时起您可以使用 Sum expression [Django-doc]相反。

关于django - 提高 Django ORM 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64052203/

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