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

Каков наилучший способ обработки Django objects.get?

Всякий раз, когда я это делаю:

thepost = Content.objects.get(name="test")

Он всегда выдает ошибку, когда ничего не найдено. Как это сделать?

4b9b3361

Ответ 1

from django.core.exceptions import ObjectDoesNotExist

try:
    thepost = Content.objects.get(name="test")
except ObjectDoesNotExist:
    thepost = None

Я пишу это из памяти, поэтому я не уверен в этом исключении.

Ответ 2

Часто полезно использовать функцию ярлыка Django get_object_or_404 вместо :

from django.shortcuts import get_object_or_404

thepost = get_object_or_404(Content, name='test')

Очевидно, что это приведет к ошибке 404, если объект не может быть найден, и ваш код будет продолжен, если он будет успешным.

Ответ 3

Вы также можете поймать общий 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."

Ответ 4

Поймать исключение

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

Ответ 5

Другой способ записи:

try:
    thepost = Content.objects.get(name="test")
except Content.DoesNotExist:
    thepost = None

просто:

thepost = Content.objects.filter(name="test").first()

Обратите внимание, что эти два не являются строго одинаковыми. Метод Менеджера get вызовет не только исключение в случае нет записи, которую вы запрашиваете, но также и когда несколько записей. Использование first при наличии более одной записи может привести к сбою вашей бизнес-логики, возвращая первую запись.

Ответ 6

Обработка исключений в разных точках ваших представлений действительно может быть громоздкой. Что касается определения пользовательского диспетчера моделей в файле 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

Ответ 7

Повышение исключение 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})