тег queryset на шаблоне - PullRequest
       8

тег queryset на шаблоне

0 голосов
/ 17 октября 2018

Я бы показал список пользователей, я возвращаю его по:

    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 голосов
/ 17 октября 2018

Само представление создает список QuerySet с, а не список User с, это связано с:

for k in user_id_list:
    user_name_list.append(<b>User.objects.filter(id__in=k)</b>)

Таким образом, вы включаете сюда отфильтрованный 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 })

Здесь мы, таким образом, создаем single QuerySet, который содержит всех пользователей с активными сессиями, и мы отображаем этот список, мы не делаем list из QuerySet s.Таким образом, это будет перечислять пользователей, вы также можете получить значения username напрямую:

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]
)<b>.values_list('username', flat=True)</b>
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 })

РЕДАКТИРОВАТЬ : если мы хотим перечислить пользователей несколько раз, если пользовательимеет несколько открытых сессий, мы можем сделать это с помощью одного запроса к базе данных, а затем «развернуть» результаты в списке, например:

active_sessions = Session.objects.filter(expire_date__gte=timezone.now())
uids=[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:
    user_dict = dict(
        User.objects.filter(
        id__in=uids
    ).values_list('id', 'username'))
    user_list = [user_dict.get(_id) for _id in uids]
    logout(request)
    return  render(request, 'page/users.html',  context={'user_name_list': user_list })
...