Само представление создает список 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 })