我有一个查询,可以向用户返回其他信息 这是我的简化模型:
class Event(..):
creator = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='event_creator_set')
class Participator(..):
status = models.CharField(..)
event = models.ForeignKey('events.Event', on_delete=models.CASCADE, related_name='participators_set')
user = models.ForeignKey('users.User', on_delete=models.CASCADE, related_name='participations_set')
我从用户管理器中获得的方法:
def additional_info(self):
from events.models import Participator
participated_events_count = Count(
'participations_set',
distinct=True,
filter=(~Q(participations_set__event__creator=F('id')) & Q(
participations_set__status=Participator.PARTICIPATED))
)
return self.get_queryset()\
.annotate(created_events_count=Count('events_set',
distinct=True))\
.annotate(followers_count=Count(
'followers_set',
filter=(Q(followers_set__is_following=True)),
distinct=True)) \
.annotate(
participated_events_count=participated_events_count)
一切都很好,没有最后的注释,但是当我尝试添加participated_events_count
值时-查询执行长达30秒
已更新 如果我用Count删除随机注释-查询执行得非常快
答案 0 :(得分:0)
您可以使用.prefetch_related()
查找相关对象并减少其他查询的数量。
return self.get_queryset().prefetch_related('participations_set')/
...
您可以使用Django Debug Toolbar获取每个页面上的查询明细。