我正在尝试在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都不支持这两种方法。
有什么建议让这个更快一点吗?
答案 0 :(得分:0)
有一个simliar question here让我得出了同样的结论。
我建议不要使用prefetch_related
,但要完成查询集的工作,直到准备好执行数据库查询。甚至可能是分页,所以你只有20或50个对象。
然后列出所有Item.pk
值并获取相关的"每个项目的一条评论"你自己(使用Max('created_on')
)。
与prefetch_related
相同,但控制力更强。