sql – Django prefetch_related与limit

前端之家收集整理的这篇文章主要介绍了sql – Django prefetch_related与limit前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有没有办法告诉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)))

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

原文链接:https://www.f2er.com/mssql/82113.html

猜你在找的MsSQL相关文章