Как получить все значения отдельного элемента модели из бд django
Есть модель содержащая login и password. Нужно получить все логины в виде списка.
Я сделал это как-то так:
login_array = [[i for i in f.values()][0]
for f in Game_user.objects.values('login')]
Есть ли способ лучше и быстрее? Нужно проверить нету ли такого логина в бд. Я решил это тем что получаю все логины из бд способом выше и просто проверяю:
if not login in login_array
Нету ли способа лучше как-то это сделать?
Views.py
from django.http import JsonResponse
from django.shortcuts import render
from .models import Game_user
import json
def login(request):
json_data = json.loads(request.body)
login = json_data['login']
password = json_data['password']
login_array = [[i for i in f.values()][0] for f in Game_user.objects.values('login')]
if login in login_array:
db_user = Game_user.objects.get(login=login)
if password == db_user.password:
return JsonResponse({'success': True})
else:
return JsonResponse({'success': False})
else:
return JsonResponse({'success': False})
def signup(request):
json_data = json.loads(request.body)
login = json_data['login']
password = json_data['password']
login_array = [[i for i in f.values()][0] for f in Game_user.objects.values('login')]
if not login in login_array:
Game_user.objects.create(login=login,password=password)
return JsonResponse({'success': True})
else:
return JsonResponse({'success': False})
models.py
class Game_user(models.Model):
login = models.CharField(max_length=50, verbose_name='login')
password = models.CharField(max_length=50, verbose_name='password')
Ответы (2 шт):
Метод exists() вам не подойдет?
login = json_data['login']
if Game_user.objects.filter(login=login).exists():
print('Такой логин существует')
У меня был аналогичный вопрос. Вот в этом ответе я наткнулся на хороший вариант с методом values_list, который возвращает кортежи. Чтобы получить в ответ не кортежи, а кверисет по одному значению, нужно добавить параметр flat=True.
Кстати, я еще добавил distinct(), чтобы получить список без дублей.
То есть получается как-то так в твоем случае:
login_array = Game_user.objects.values_list('login', flat=True).distinct()