Django существует() по сравнению с DoNotExist

У меня есть несколько вопросов о django DoesNotExist exists() и исключение DoesNotExist.

Пример кода:

id = 1
# first
if User.objects.get(pk=id).exists():
    # my logic
    pass
# second
try:
    User.objects.get(pk=id)
    # my logic
    pass
except User.DoesNotExist:
    return 0

Я часто использую метод get(). Какая практика лучше? Какой код лучше? Первый или второй?

Ответ 1

if User.objects.get(pk=id).exists()

Это не сработает, поэтому на вопрос довольно легко ответить: этот путь уступает способам, которые работают :-)

Я предполагаю, что вы на самом деле не сделали Minimal Complete Verifiable Example и поэтому пропустили ошибку, когда вы разместили неподтвержденный код.


Итак, я полагаю, вы спрашиваете о разнице между:

Разница в том, что:

  • Метод QuerySet.exists находится в наборе запросов, то есть вы спрашиваете его о запросе ("есть ли экземпляры, соответствующие этому запросу?"), И вы еще не пытаетесь получить какой-либо конкретный экземпляр.

  • Исключение DoesNotExist для модели возникает, когда вы фактически пытались получить один экземпляр, а он не существовал.

Используйте тот, который правильно выражает ваше намерение.

Ответ 2

Вы можете найти дополнительную информацию в docs: около exists(), но exists() работает только для QuerySet

Возвращает значение True, если QuerySet содержит любые результаты, а False, если нет. Это пытается выполнить запрос самым простым и быстрым способом, но он выполняет почти тот же запрос, что и обычный запрос QuerySet.

exists() полезен для поиска, относящегося как к членству объектов в QuerySet, так и к существованию любых объектов в QuerySet, особенно в контексте большого QuerySet.

Но ObjectDoesNotExist работает только с get().

Также вы можете попробовать другой подход:

user = User.objects.filter(id=2)
if user:
    # put your logic
    pass

Ответ 3

в модели django, если вы собираетесь использовать model.objects.get() если он не существует, возникает ошибка. в этом случае вы можете использовать DoesNotExist вместе с except:

try:
  val = Model.objects.get(pk=val) # if nothing found it will raise an exception
exception:
  you can trace an exception without mentioning anything on top.
(or)
exception ObjectDoesNotExist:
  # it will come here if exception is DoesNotExist

Ответ 4

Всякий раз, когда вы хотите проверить, есть ли хотя бы один экземпляр класса, используйте метод exits, потому что он проверяет базу данных только на выход, а не извлекает ее. Так что это быстрый метод .get пытается получить экземпляр с заданным аргументом.

Ответ 5

Для Django версии 2.0.6 вы можете сделать следующее, и это будет работать:

if Model.objects.filter(my_id=objectid).exists():
  myobject = get_object_or_404(Model, my_id=objectid)
  context = {'myobject': myobject}
  return render(request, self.template_name, context)

Вы можете получить больше информации здесь: https://docs.djangoproject.com/en/2.1/ref/models/querysets/