Всякий раз, когда я это делаю:
thepost = Content.objects.get(name="test")
Он всегда выдает ошибку, когда ничего не найдено. Как это сделать?
Всякий раз, когда я это делаю:
thepost = Content.objects.get(name="test")
Он всегда выдает ошибку, когда ничего не найдено. Как это сделать?
from django.core.exceptions import ObjectDoesNotExist
try:
thepost = Content.objects.get(name="test")
except ObjectDoesNotExist:
thepost = None
Я пишу это из памяти, поэтому я не уверен в этом исключении.
Часто полезно использовать функцию ярлыка Django get_object_or_404
вместо :
from django.shortcuts import get_object_or_404
thepost = get_object_or_404(Content, name='test')
Очевидно, что это приведет к ошибке 404, если объект не может быть найден, и ваш код будет продолжен, если он будет успешным.
Вы также можете поймать общий DoNotExist. Согласно документам http://docs.djangoproject.com/en/dev/ref/models/querysets/
from django.core.exceptions import ObjectDoesNotExist
try:
e = Entry.objects.get(id=3)
b = Blog.objects.get(id=1)
except ObjectDoesNotExist:
print "Either the entry or blog doesn't exist."
Поймать исключение
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
thepost = None
альтернативно вы можете фильтровать, который вернет пустой список, если ничего не соответствует
posts = Content.objects.filter(name="test")
if posts:
# do something with posts[0] and see if you want to raise error if post > 1
Другой способ записи:
try:
thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
thepost = None
просто:
thepost = Content.objects.filter(name="test").first()
Обратите внимание, что эти два не являются строго одинаковыми. Метод Менеджера get
вызовет не только исключение в случае нет записи, которую вы запрашиваете, но также и когда несколько записей. Использование first
при наличии более одной записи может привести к сбою вашей бизнес-логики, возвращая первую запись.
Обработка исключений в разных точках ваших представлений действительно может быть громоздкой. Что касается определения пользовательского диспетчера моделей в файле models.py, например
class ContentManager(model.Manager):
def get_nicely(self, **kwargs):
try:
return self.get(kwargs)
except(KeyError, Content.DoesNotExist):
return None
а затем включить его в контентный класс Model
class Content(model.Model):
...
objects = ContentManager()
Таким образом, это легко можно рассматривать в представлениях i.e.
post = Content.objects.get_nicely(pk = 1)
if post != None:
# Do something
else:
# This post doesn't exist
Повышение исключение Http404 отлично работает:
from django.http import Http404
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
return render_to_response('polls/detail.html', {'poll': p})