有没有办法告诉prefetch_related只能获取一组有限的相关对象?假设我正在获取用户列表,我知道我想要获取他们最近的评论.在循环中为每个用户提取注释而不是在获取用户时使用prefetch_related来预取它们.我的理解是,这将获取原始查询结果中存在的任何用户所做的所有评论,但我只想显示每个用户的最新5.
如果评论列表真的很大,这会如何影响性能?有没有办法在单个(或2)查询中为每个用户提取5条评论?它不一定是原始的查询用于提取用户,但这将是不错的.
我本来是想转一下
users = User.objects.all() for user in users: user.comments.all()[:10]
变成这样的东西
User.objects.all().prefetch_related('comments',limit=10)
解决方法
限制预取相关对象数量的唯一方法似乎是使用Prefetch()和过滤文件.使用切片
User.objects.all().prefetch_related( Prefetch('msg_sent',queryset=UserMsg.objects.order_by('-created')[:10]))
返回错误
AssertionError: Cannot filter a query once a slice has been taken.
from datetime import datetime,timedelta timelimit = datetime.now() - timedelta(days=365) User.objects.all().prefetch_related( Prefetch('msg_sent',queryset=UserMsg.objects.filter(created__gte=timelimit)))
虽然这不返回固定数字,但在某些情况下可能会有用,并且会减少预取对象的数量.