2012-07-30 41 views
26

Ho bisogno di verificare se Model.objects.filter(...) ha trovato nulla, ma non è necessario inserire nulla. Il mio codice finora è:Verifica se esiste un oggetto

user_pass = log_in(request.POST) # form class 
if user_pass.is_valid(): 
    cleaned_info = user_pass.cleaned_data 
    user_object = User.objects.filter(email = cleaned_info['username']) 
+0

non lo faccio capire cosa stai cercando di fare. Stai cercando di verificare se un utente esiste già al fine di generare un errore? Perché hai bisogno di controllarlo? E perché stai facendo questo in una "vista modulo"? Prova a rispondere a questa domanda per vedere se possiamo aiutarti meglio ... Aggiungi un contesto al tuo problema, non solo la domanda che hai in mente. A volte il problema che pensi di avere non è il vero problema, quindi la tua domanda non è corretta ... – marianobianchi

+0

Possibile duplicato di [qual è il modo giusto per convalidare se un oggetto esiste in una vista django senza restituire 404?] (http://stackoverflow.com/questions/639836/what-is-the-right-way-to-validate-if-an-object-exists-in-a-django-view-without-r) – Wtower

risposta

33

Dal filter restituisce un QuerySet, è possibile utilizzare count per controllare quanti risultati sono stati restituiti. Questo presuppone che in realtà non hai bisogno dei risultati.

num_results = User.objects.filter(email = cleaned_info['username']).count() 

Dopo aver esaminato la documentazione però, è meglio chiamare solo len sul vostro filtro se si sta pensando di usare i risultati dopo, mentre sarete fare solo interrogazione uno sql:

Una chiamata count() esegue un SELECT COUNT (*) dietro le quinte, quindi dovresti sempre usare count() piuttosto che caricare tutto il record in oggetti Python e chiamare len() sul risultato (a meno che tu non debba caricare gli oggetti nella memoria comunque, nel qual caso len() sarà più veloce).

num_results = len(user_object) 
+50

While '. count() 'funziona, puoi anche usare' .exists() '. https://docs.djangoproject.com/en/dev/ref/models/querysets/#exists –

+3

Vorrei aggiungere al commento sopra che mentre .count() funziona, sarà più lento di .exists() se il conteggio> 1 e più grande è il conteggio più lentamente diventerà – Bob

5

è anche possibile utilizzare get_object_or_404(), si alzerà un Http404 se l'oggetto non è stato trovato:

user_pass = log_in(request.POST) #form class 
if user_pass.is_valid(): 
    cleaned_info = user_pass.cleaned_data 
    user_object = get_object_or_404(User, email=cleaned_info['username']) 
    # User object found, you are good to go! 
    ... 
4

il valore booleano di un QuerySet vuoto è anche falso, così si potrebbe anche solo fare ...

... 
if not user_object: 
    do insert or whatever etc. 
+2

questo non è molto efficiente in quanto valuterà la query e, quando gli oggetti esistono, li caricherà in memoria – mpaf

2

È possibile utilizzare:

try: 
    # get your models 
except ObjectDoesNotExist: 
    # do something 
Problemi correlati