加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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)))

虽然这不返回固定数字,但在某些情况下可能会有用,并且会减少预取对象的数量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读