Проверьте, существует ли объект
Мне нужно проверить, что Model.objects.filter(...)
что-то появилось, но ничего не нужно вставлять. До сих пор мой код:
user_pass = log_in(request.POST) # form class
if user_pass.is_valid():
cleaned_info = user_pass.cleaned_data
user_object = User.objects.filter(email = cleaned_info['username'])
Ответы
Ответ 1
Так как filter
возвращает a QuerySet
, вы можете использовать count, чтобы проверить, сколько результатов было возвращено. Это предполагает, что вам действительно не нужны результаты.
num_results = User.objects.filter(email = cleaned_info['username']).count()
Однако, просмотрев документацию, лучше просто называть len на вашем фильтре, если вы планируете использовать результаты позже, так как вы будете делать только один запрос sql:
Вызов count() выполняет SELECT COUNT (*) за кулисами, поэтому вы всегда должны использовать count(), а не загружать всю запись в объекты Python и вызывать len() для результата (если вам не нужно все равно загружать объекты в память, в этом случае len() будет быстрее).
num_results = len(user_object)
Ответ 2
Я думаю, что самая простая с точки зрения логики и эффективности использует функцию запроса существует(), описанная здесь:
https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.exists
Итак, в вашем примере выше я просто напишу:
if User.objects.filter(email = cleaned_info['username']).exists():
# at least one object satisfying query exists
else:
# no object satisfying query exists
Ответ 3
Вы также можете использовать get_object_or_404(), он будет поднимать Http404
, если объект не был найден:
user_pass = log_in(request.POST) #form class
if user_pass.is_valid():
cleaned_info = user_pass.cleaned_data
user_object = get_object_or_404(User, email=cleaned_info['username'])
# User object found, you are good to go!
...
Ответ 4
логическое значение пустого QuerySet также является False, поэтому вы также можете просто сделать...
...
if not user_object:
do insert or whatever etc.
Ответ 5
Вы можете использовать:
try:
# get your models
except ObjectDoesNotExist:
# do something