从Django queryset中只获取一个相关对象

时间:2016-05-10 15:22:13

标签: python django

我正在尝试在Django中优化类似feed的查询,在那里我获得由我关注的用户评论的唯一项目。

        queryset_comments = Item.objects.distinct() \
        .prefetch_related('comments', 'comments__user') \
        .filter(comments__user__in=self.request.user.following.all()) \
        .prefetch_related(
            Prefetch('comments', queryset=Comment.objects.filter(
                user__in=self.request.user.following.all()
            ).order_by('-created_on'), to_attr='activity')
        ) \
        .all()

这为我提供了一个相关的activity对象,其中包含我所关注的用户所做的所有评论的列表,其中最新的评论是第一个。现在我只需要第一个,所以我循环其他查询集并设置我需要的值:

        for item in queryset_comments:
            item.feed_user = item.activity[0].user
            item.feed_date = item.activity[0].created_on
            item.feed_activity = 'commented'

但是这个循环花了超过2秒只有大约500个项目...我尝试使用切片进行预取(通过将[0].first()添加到Prefetch查询集,但Django ORM都不支持这两种方法。

有什么建议让这个更快一点吗?

1 个答案:

答案 0 :(得分:0)

有一个simliar question here让我得出了同样的结论。

我建议不要使用prefetch_related,但要完成查询集的工作,直到准备好执行数据库查询。甚至可能是分页,所以你只有20或50个对象。

然后列出所有Item.pk值并获取相关的"每个项目的一条评论"你自己(使用Max('created_on'))。

prefetch_related相同,但控制力更强。