Una funzione get_or_none()
è stata proposed, multipletimes ora. L'avviso di rifiuto è inversione di funzione, con cui potresti o meno essere d'accordo. La funzionalità è presente - con semantica leggermente diversa - nel metodo di queryset first()
.
Ma andiamo con ordine:
Il manager lancia World.DoesNotExist
, una sottoclasse specializzata di ObjectDoesNotExist
quando un oggetto World
non è stato trovato:
try:
personalProfile = World.objects.get(ID=personID)
except World.DoesNotExist:
pass
C'è anche get_object_or_404()
che solleva un'eccezione Http404
quando l'oggetto era non trovato.
È anche possibile eseguire il rollover del proprio get_or_none()
. Una possibile applicazione potrebbe essere:
def get_or_none(queryset, *args, **kwargs):
try:
return queryset.get(*args, **kwargs)
except ObjectDoesNotExist:
return None
Si noti che questo solleva ancora MultipleObjectsReturned
quando viene trovato più di un oggetto corrispondente.Se si vuole sempre il primo oggetto indipendentemente da tutti gli altri, è possibile semplificare utilizzando first()
, che restituisce None
quando il set di query è vuota:
def get_or_none(queryset, *args, **kwargs):
return queryset.filter(*args, **kwargs).first()
Nota tuttavia, per far funzionare in modo affidabile, è necessario un giusto ordine per gli oggetti , perché in presenza di più oggetti first()
potrebbe essere non deterministico (probabilmente restituisce il primo oggetto dall'indice del database utilizzato per filtrare la query e né gli indici né le tabelle sottostanti devono essere ordinati o hanno anche un ordine ripetibile).
Utilizzare entrambi, tuttavia, solo quando l'utilizzo dell'oggetto da recuperare è strettamente facoltativo per l'ulteriore flusso del programma. Quando il mancato recupero di un oggetto è un errore, utilizzare get_object_or_404()
. Quando un oggetto deve essere creato quando non esiste, utilizzare get_or_create()
. In questi casi, entrambi sono più adatti a semplificare il flusso del programma.
Grazie per questo aiuto. Ho provato questo e ricevendo l'errore perché non ho importato un Http404 Quindi correggi questo da "da django.http import Http404" e perfetto! –