Мне нужно проверить, существует ли объект, и вернуть объект, а затем на основе этого выполнить действия. Как правильно это сделать, не возвращая 404?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
django
django-views
Расиэль
источник
источник
if listing:
Должно бытьelse:
.Ответы:
Я бы не стал использовать обертку 404, если вам не дадут 404. Это злоупотребление намерением. Вместо этого просто поймайте DoesNotExist.
try: listing = RealEstateListing.objects.get(slug_url=slug) except RealEstateListing.DoesNotExist: listing = None
источник
exists()
если вам нужно что-то делать с объектом.values_list('id', flat=True)
. если мне нужно просто посмотреть, существует лиlisting = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
он относится к модели, а не к самому объекту. Почему нетRealEstateListing.objects.get(slug_url=slug).DoesNotExist
?Вы также можете:
if not RealEstateListing.objects.filter(slug_url=slug).exists(): # do stuff...
Иногда проще использовать
try: except:
блок, а иногда однострочныйexists()
код делает код более понятным ... все зависит от логики вашего приложения.источник
exists()
это не работаетget()
, верно?get()
позже, он отправит второй запрос в базу данных.try-except
болееexists()
.listing = RealEstateListing.objects.filter(slug_url=slug).first()
источник
if listing:
.exists()
. Я думаю, что в SO есть несколько разных ответов, как что-то делать. Может быть, это лучше для тех, кто тоже хочет использовать объект, если он существует. Я бы не стал устанавливать никаких правил, если пытаться / кроме того, следует избегать или нет. Иногда это хорошо, а иногда плохо, например, если вы просто хотите сделать очень компактный код.Я бы сделал это так просто:
listing = RealEstateListing.objects.filter(slug_url=slug) if listing: # do stuff
Я не вижу необходимости пытаться / поймать. Если в результате потенциально есть несколько объектов, используйте first (), как показано пользователем Хенриком Хейно.
источник