2015-08-24 2 views
5

Возможно ли поймать ошибку MultipleObjectsReturned в Django?Как поймать ошибку MultipleObjectsReturned в django

Я делаю SearchQuery и если есть больше чем один объектов Я хочу, чтобы первым в списке будет принято, поэтому я попытался это:

try: 
    Location.objects.get(name='Paul') 
except MultipleObjectsReturned: 
    Location.objects.get(name='Paul')[0] 

Однако он существует в doc хотя

глобальная переменная MultipleObjectsReturned не существует

+1

Если я не ошибаюсь, исключение является собственностью модели. Поскольку эта переменная не существует, мне кажется, что это ошибка. – dylan7

+0

https://docs.djangoproject.com/en/1.8/ref/exceptions/#multipleobjectsreturned – Gocht

+1

Однако я предлагаю использовать фильтр, который возвращает запрос, тогда вы можете взять первый элемент в наборе запросов, используя индексирование. Get для возврата 1 фактического объекта. Таким образом, вам не нужно иметь дело с проверкой ошибок. – dylan7

ответ

5

Это не лучшая практика. Вы можете технически сделать это, не используя исключения. В этом примере вы намеревались использовать Location и Car?

Вы можете сделать это:

Location.objects.filter(name='Paul').order_by('id').first() 

Я настоятельно рекомендую вам прочитать ссылку API Django QuerySet.

https://docs.djangoproject.com/en/1.8/ref/models/querysets/

Чтобы ответить на ваш вопрос о том, где существует исключение - вы всегда можете получить доступ к этим исключения QuerySet на самой модели. Например. Location.DoesNotExist и Location.MultipleObjectsReturned. Имможно импортировать их, если у вас уже импортирована модель.

+0

Да, правда! извините, означало расположение обоих времен. Почему использование исключений - не лучшая практика? – Tom

+0

Тогда вы, вероятно, хотите просто «Location.objects.filter (name = 'Paul»). Order_by (' id '). First() '. Он возвращает None, если нет записи с этим именем. Я обновил ответ. Использование исключений в этом случае не является необходимым. Вместо того, чтобы вызывать исключение, вы все равно можете иметь счастливый путь, не создавая никаких ошибок. – veggie1

+0

я вижу, хорошо спасибо! – Tom

15

Используйте фильтр:

Location.objects.filter(name='Paul').first() 

Или импортировать исключение:

from django.core.exceptions import MultipleObjectsReturned 
... 
try: 
    Location.objects.get(name='Paul') 
except MultipleObjectsReturned: 
    Location.objects.filter(name='Paul').first() 
+3

отлично работает, спасибо! забыли импортировать исключения – Tom

+0

** Примечание **: 'Location.objects.get (name = 'Paul') [0]' снова поднимет 'MultipleObjectsReturned'. Используйте 'Location.objects.filter (name = 'Paul'). First()' вместо этого. – jojo

8

Это более питонический способ сделать это.

try: 
    Location.objects.get(name='Paul') 
except Location.MultipleObjectsReturned: 
    Location.objects.filter(name='Paul')[0] 
+1

Вы имеете в виду 'filter', но по крайней мере он отвечает, как поймать исключение. – RemcoGerlich

+0

@RemcoGerlich да, он фильтрует или возвращает объект в соответствии с запросом. get return object while .filter возвращает queryset. –

+0

@VaseemAhmedKhan Ответ должен быть обновлен, чтобы выполнить 'Location.objects.filter (name = 'Paul') [0]', иначе блок except приведет к тому, что будет выведено то же самое исключение.Вам нужен запрос, потому что в нем содержится логика о возврате объекта _which_, например 'Location.objects.get (name = 'Paul'). Order_by ('age') [0]' вернет младшего Павла в базу данных. Вот как вы возвращаете правильного Павла, согласно вашей бизнес-логике. – AlanSE

Смежные вопросы