我将显示用户列表,我通过以下方式将其返回:
active_sessions = Session.objects.filter(expire_date__gte=timezone.now())
user_id_list = []
user_name_list = []
tot_active_sessions = active_sessions.count()
for session in active_sessions:
data = session.get_decoded()
user_id_list.append(data.get('_auth_user_id', None))
for k in user_id_list:
user_name_list.append(User.objects.filter(id__in=k))
if tot_active_sessions > _sessions_limit :
logout(request)
return render(request, 'page/users.html', context={'user_name_list': user_name_list})
在我的模板“ page / users.html”中:
{% for username in user_name_list %}
{{ username }}
{% endfor %}
具有以下结果:
•<QuerySet [<User: guest2>]>
•<QuerySet [<User: guest1>]>
我如何只获取:
•guest2
•guest1
在其他情况下,我在模板上看不到queryset标记,我也不知道这个结果。
答案 0 :(得分:2)
视图本身会生成QuerySet
的列表,而不是User
的列表,这是由于以下原因造成的:
for k in user_id_list:
user_name_list.append(User.objects.filter(id__in=k))
因此,您在此处包括一个过滤的 QuerySet
,而不是User
对象本身。
尽管如此,视图中的代码还是相当复杂,并且在可读性和效率上都可以得到改善:
active_sessions = Session.objects.filter(expire_date__gte=timezone.now())
user_list = User.objects.filter(
id__in=[session.get_decoded().get('_auth_user_id', None) for session in active_sessions]
)
tot_active_sessions = active_sessions.count()
if tot_active_sessions > _sessions_limit:
logout(request)
return render(request, 'page/users.html', context={'user_name_list': user_list })
因此,我们在此构造一个单个 QuerySet
,其中包含所有具有活动会话的用户,并且呈现该列表,我们不将{{1 } s。因此,这将枚举用户,您还可以使用以下方法直接获取list
值:
QuerySet
编辑:如果我们想多次列出用户,如果一个用户有多个打开的会话,我们仍然可以使用单个数据库查询来完成此操作,然后将结果“展开”到列表,例如:
username