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
查询时,它将检索所需的记录。有帮助吗?
我阅读了有关查询集惰性的查询集 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
查询时,它将检索所需的记录。有帮助吗?