Django Querysets 什么时候在视图中执行?

When are Django Querysets executed in the view?

我阅读了有关查询集惰性的查询集 Django 文档,但在这里仍然有点困惑。

所以在我看来,我将查询集设置为这样的变量

players = Players.objects.filter(team=team)

以后我有一个排序机制可以应用

sort = '-player_last_name'


if pts > 20:
    players = players.filter(pts__gte = pts).order_by(sort)
else:
    players = players.filter(pts__lte = pts).order_by(sort)

if ast < 5:
   players = players.filter(asts__lte = ast).order_by(sort)
else:
   players = players.filter(asts__gte = ast).order_by(sort)

context = {players: players)

return render(request, '2021-2022/allstars.html', context)

我想知道的是,玩家查询集是什么时候评估的?是在呈现每个页面时,还是每次我将查询集分配给变量时?因为如果是前者,那么我可以直接应用 .order_by(sort) 链,之前的应用都是多余的。

如果您“使用”查询集,则会评估

QuerySet。您通过枚举查询集来使用查询集,调用 .get(…), .exists(…), .aggregate(…) or .count(…),检查真实性(例如使用 if myqueryset:bool(queryset),或调用 len(…) 等。通常根据经验,如果您对其执行操作使得结果不再是 QuerySet.

,它就会被评估

如果你枚举它,或者你调用 len(…) 结果缓存在 QuerySet,所以第二次调用它,或者在你调用 [=17= 之后枚举它] 将不会 再次访问数据库。

在这种特定情况下,QuerySet 中的 none 会在您调用 render(…) 函数之前进行计算。例如,如果您在模板中使用 {% if players %}{% for players %}{{ players|length }}{{ players.exists }},那么它将评估查询集。

Django 查询被设计为“惰性”——也就是说。在某些东西请求实际数据之前,他们不会 运行 查询数据库。可以通过添加过滤和其他类似功能来修改查询。

例如,以下代码在搜索字符串为 'all' 时请求所有 TeamMember 对象,但在其他情况下添加过滤器以将名称限制为与给定搜索匹配的名称。

    squad_list = TeamMember.objects(state__in={"Hired", "Joined", "Staff", "Recruiting"})
    if squadname != 'all':
        squad_list = squad_list(squad__icontains=squadname.lower())

当最终执行 squadlist 查询时,它将检索所需的记录。有帮助吗?