Funkcja get_or_none()
została teraz proposed, multipletimes teraz. Powiadomienie o odrzuceniu to funkcja pełzania, z którą możesz lub nie możesz się zgodzić. Funkcjonalność jest obecna - z nieco inną semantyką - w metodzie zapytań first()
.
Ale pierwsze rzeczy pierwsze:
Menedżer rzuca World.DoesNotExist
, wyspecjalizowanym podklasa ObjectDoesNotExist
gdy World
obiekt nie został znaleziony:
try:
personalProfile = World.objects.get(ID=personID)
except World.DoesNotExist:
pass
Jest też get_object_or_404()
który podnosi Http404
wyjątek, gdy obiekt był nie znaleziono.
Możesz także przetasować swój własny get_or_none()
. Ewentualna realizacja może być:
def get_or_none(queryset, *args, **kwargs):
try:
return queryset.get(*args, **kwargs)
except ObjectDoesNotExist:
return None
Należy pamiętać, że to wciąż budzi MultipleObjectsReturned
, gdy więcej niż jeden obiekt zostanie znaleziony.Jeśli chcesz zawsze pierwszy obiekt niezależnie od wszelkich innych, można uprościć używając first()
, która zwraca None
gdy queryset jest pusty:
def get_or_none(queryset, *args, **kwargs):
return queryset.filter(*args, **kwargs).first()
Uwaga jednak na to, aby pracować niezawodnie, trzeba odpowiedniej kolejności dla obiektów , ponieważ w obecności wielu obiektów first()
może być niedeterministyczny (prawdopodobnie zwraca pierwszy obiekt z indeksu bazy danych używanego do filtrowania zapytania i ani indeksy, ani stoły bazowe nie muszą być sortowane, a nawet mieć powtarzalne zamówienie).
Używaj obu jednak tylko wtedy, gdy użycie obiektu do pobrania jest całkowicie opcjonalne dla dalszego przepływu programu. Gdy niepowodzenie w pobieraniu obiektu jest błędem, użyj get_object_or_404()
. Jeśli obiekt ma zostać utworzony, gdy nie istnieje, użyj get_or_create()
. W tych przypadkach obie są lepiej dostosowane do uproszczenia przepływu programu.
Dzięki za pomoc. Próbuję tego i otrzymuję błąd , ponieważ nie importowałem Http404 . Napraw to przez "z django.http import Http404" i idealnie! –