具有多个注释的查询速度变慢

时间:2018-11-13 11:28:16

标签: django django-orm

我有一个查询,可以向用户返回其他信息 这是我的简化模型:

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删除随机注释-查询执行得非常快

1 个答案:

答案 0 :(得分:0)

您可以使用.prefetch_related()查找相关对象并减少其他查询的数量。

return self.get_queryset().prefetch_related('participations_set')/
    ...

您可以使用Django Debug Toolbar获取每个页面上的查询明细。