2015-08-24 3 views
5

È possibile rilevare l'errore MultipleObjectsReturned in Django?come rilevare l'errore MultipleObjectsReturned in django

faccio un SearchQuery e se ci sono più di un oggetti voglio che il primo della lista sarà presa così ho provato questo:

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

Tuttavia, esiste nella doc se

variabile globale MultipleObjectsReturned non esiste

+1

Se non sbaglio, l'eccezione è una proprietà del modello. Poiché quella variabile non esiste, l'errore sembra indurmi a crederlo. – dylan7

+0

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

+1

Tuttavia, suggerisco di utilizzare il filtro, che restituisce un set di query, quindi è possibile prendere il primo elemento nel set di query utilizzando l'indicizzazione. Get è per restituire 1 oggetto reale. Quindi non devi occuparti del controllo degli errori. – dylan7

risposta

5

Questa non è la migliore pratica. Puoi tecnicamente farlo senza usare eccezioni. Hai intenzione di utilizzare Location e Car in questo esempio?

Si può fare questo:

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

vi consiglio caldamente di leggere il riferimento API Django QuerySet.

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

per rispondere alla tua domanda su dove esiste l'eccezione - è sempre possibile accedere a queste eccezioni QuerySet sul modello stesso. Per esempio. Location.DoesNotExist e Location.MultipleObjectsReturned. Non è necessario importarli se si dispone già del modello importato.

+0

sì vero! scusate, intendevo Location entrambe le volte. Perché usare le eccezioni non è la migliore pratica? – Tom

+0

Quindi ciò che si desidera è semplicemente 'Location.objects.filter (name = 'Paul'). Order_by ('id'). First()'. Restituisce None se non c'è un record con quel nome. Ho aggiornato la risposta. L'utilizzo di eccezioni in questo caso non è necessario. Invece di generare un'eccezione, puoi comunque avere un percorso felice senza generare errori. – veggie1

+0

vedo, ok grazie! – Tom

15

Utilizzare un filtro:

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

o importare l'eccezione:

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

opere perfette, grazie! dimenticato di importare le eccezioni – Tom

+0

** Nota **: 'Location.objects.get (name = 'Paul') [0]' genererà nuovamente 'MultipleObjectsReturned'. Usa 'Location.objects.filter (name = 'Paul'). First()' invece. – jojo

8

Questo è un modo più plateale di farlo.

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

Significa 'filtro', ma almeno risponde come rilevare l'eccezione. – RemcoGerlich

+0

@RemcoGerlich yes filtra o restituisce oggetto in base alla query. ottieni oggetto restituito mentre .filter restituisce queryset. –

+0

@VaseemAhmedKhan La risposta dovrebbe essere aggiornata per fare 'Location.objects.filter (name = 'Paul') [0]', altrimenti il ​​blocco tranne farà sì che venga generata la stessa eccezione.È necessario un set di query perché contiene la logica su _which_ oggetto da restituire, ad esempio 'Location.objects.get (name = 'Paul'). Order_by ('age') [0]' restituirà il più giovane Paul nel database. In questo modo restituisci il Paul corretto, in base alla tua logica aziendale. – AlanSE