模板上的queryset标签

时间:2018-10-17 09:24:49

标签: django templates django-queryset

我将显示用户列表,我通过以下方式将其返回:

    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标记,我也不知道这个结果。

1 个答案:

答案 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