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/