2015-08-24 15 views
5

Czy można złapać błąd MultipleObjectsReturned w Django?jak złapać błąd MultipleObjectsReturned w django

robię SEARCHQUERY a jeśli istnieje więcej niż jeden obiektów chcę, że pierwszy na liście zostaną podjęte tak próbowałem to:

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

Jednak istnieje w doc chociaż

zmienna globalna MultipleObjectsReturned nie istnieje

+1

Jeśli się nie mylę, wyjątek stanowi propozycję modelu. Ponieważ ta zmienna nie istnieje, wydaje mi się, że błąd sprawia, że ​​tak sądzę. – dylan7

+0

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

+1

Sugeruję jednak użycie filtru, który zwraca zestaw zapytań, a następnie za pomocą indeksowania można pobrać pierwszy element w zestawie zapytań. Get jest za zwrócenie 1 rzeczywistego obiektu. Nie musisz więc zajmować się sprawdzaniem błędów. – dylan7

Odpowiedz

5

to nie jest najlepsza praktyka. Możesz to technicznie zrobić bez wyjątków. Czy w tym przykładzie zamierzasz używać Location i Car?

Można to zrobić:

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

sugeruję przeczytać odniesienie API Django queryset.

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

Aby odpowiedzieć na pytanie, gdzie istnieje wyjątek - zawsze można uzyskać dostęp do tych wyjątków queryset temat samego modelu. Na przykład. Location.DoesNotExist i Location.MultipleObjectsReturned. Nie musisz ich importować, jeśli masz już zaimportowany model.

+0

prawda! Przepraszam, oznaczało Lokalizacja za każdym razem. Dlaczego używanie wyjątków nie jest najlepszą praktyką? – Tom

+0

To, czego prawdopodobnie chcesz, to po prostu 'Location.objects.filter (name = 'Paul'). Order_by ('id'). First()'. Zwraca None, jeśli nie ma rekordu o tej nazwie. Zaktualizowałem odpowiedź. Używanie wyjątków w tym przypadku jest niepotrzebne. Zamiast wywoływania wyjątku, nadal możesz mieć szczęśliwą ścieżkę bez zgłaszania błędów. – veggie1

+0

Widzę, ok dzięki! – Tom

15

Użyj filtra:

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

lub importować wyjątek:

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

idealne dzieło, dzięki! zapomniałem zaimportować wyjątki – Tom

+0

** Uwaga **: 'Location.objects.get (name = 'Paul') [0]' spowoduje ponowne wywołanie 'MultipleObjectsReturned'. Zamiast tego użyj 'Location.objects.filter (name = 'Paul'). First()'. – jojo

8

To jest bardziej pythonic sposób to zrobić.

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

Masz na myśli 'filter', ale przynajmniej odpowiada na to, jak złapać wyjątek. – RemcoGerlich

+0

@RemcoGerlich yes to filtruje lub zwraca obiekt zgodnie z zapytaniem. get return while while .filter zwraca zestaw zapytań. –

+0

@VaseemAhmedKhan Odpowiedź powinna zostać zaktualizowana, aby wykonać 'Location.objects.filter (name = 'Paul') [0]', w przeciwnym razie blok wyjątku spowoduje zgłoszenie tego samego wyjątku.Będziesz potrzebował zestawu zapytań, ponieważ zawiera on logikę o obiekcie, do którego chcesz powrócić, na przykład 'Location.objects.get (name = 'Paul'). Order_by ('age') [0]' zwróci najmłodszego Pawła w bazie danych. W ten sposób zwracasz poprawnego Pawła, zgodnie z logiką biznesową. – AlanSE