sql – Django prefetch_related与limit
发布时间:2020-12-12 16:32:06 所属栏目:MsSql教程 来源:网络整理
导读:有没有办法告诉prefetch_related只能获取一组有限的相关对象?假设我正在获取用户列表,我知道我想要获取他们最近的评论.在循环中为每个用户提取注释而不是在获取用户时使用prefetch_related来预取它们.我的理解是,这将获取原始查询结果中存在的任何用户所做的
有没有办法告诉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) 所以如果一个用户有100或10000的注释,它们并不都被加载到内存中.在原始SQL中如何做这样的事情? 解决方法限制预取相关对象数量的唯一方法似乎是使用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))) 虽然这不返回固定数字,但在某些情况下可能会有用,并且会减少预取对象的数量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |