Django视图中的QuerySet在什么时候会被执行?
Django QuerySet执行时机与排序冗余问题解答
执行时机说明
Django QuerySet 完全遵循惰性执行特性,只有在实际需要获取查询结果的时候才会触发真实的数据库请求,单纯的赋值、链式调用filter/order_by等查询方法时不会执行SQL。
你代码中的players查询集,会在模板渲染过程中实际访问/遍历查询结果的时候才真正执行数据库查询,把查询集存入context、做中间的过滤拼接操作都不会触发查询。
会触发QuerySet执行的常见场景包括:
- 迭代遍历查询集(比如模板里的
{% for player in players %}) - 调用
list()/len()/bool()等方法对查询集做求值 - 调用
.first()/.last()/.count()等取结果的方法 - 序列化查询集内容
排序逻辑冗余说明
你的判断是对的,代码里多次调用order_by(sort)属于冗余操作,可直接优化:
- 每次调用
order_by都会覆盖查询集之前设置的排序规则,你所有order_by调用传的都是同一个sort参数,最终效果和只在所有过滤逻辑结束后调用一次完全一致 - 优化后的代码可精简为:
players = Players.objects.filter(team=team) sort = '-player_last_name' if pts > 20: players = players.filter(pts__gte=pts) else: players = players.filter(pts__lte=pts) if ast < 5: players = players.filter(asts__lte=ast) else: players = players.filter(asts__gte=ast) # 仅最后调用一次排序即可 players = players.order_by(sort) context = {'players': players} return render(request, '2021-2022/allstars.html', context)
内容的提问来源于stack exchange,提问作者nick_rinaldi
相关产品推荐
相关产品推荐

