Подтвердить что ты не робот

Проверьте, существует ли объект

Мне нужно проверить, что 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'])
4b9b3361

Ответ 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