2010-05-18 10 views
29

Dire che ho un tavolo People, c'è un modo per controllare rapidamente se esiste un oggetto People con un nome di 'Fred'? So che posso interrogarePer i modelli Django, esiste una scorciatoia per vedere se esiste un record?

People.objects.filter(Name='Fred') 

e quindi controllare la lunghezza del risultato restituito, ma c'è un modo per farlo in un modo più elegante?

+0

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

risposta

33

Aggiornamento:

Come accennato nelle risposte più recenti, dal momento che Django 1.2 è possibile utilizzare il metodo di exists() invece (link).


risposta originale:

Dont' uso len() sul risultato, è necessario utilizzare People.objects.filter(Name='Fred').count(). Secondo la documentazione Django,

count() esegue un SELECT COUNT (*) dietro le quinte, così si dovrebbe utilizzare sempre count(), piuttosto che il caricamento di tutti i record in Python oggetti e chiamando len() sul risultato (a meno che non sia necessario caricare gli oggetti in memoria, nel qual caso len() sarà più veloce).

fonte: Django docs

5

Si potrebbe utilizzare count() Ad esempio:

People.objects.filter(Name='Fred').count() 

Se la colonna Nome è unica, allora si potrebbe fare:

try: 
    person = People.objects.get(Name='Fred') 
except (People.DoesNotExist): 
    # Do something else... 

Si potrebbe anche usare get_object_or_404() Ad esempio:

from django.shortcuts import get_object_or_404 
get_object_or_404(People, Name='Fred') 
6

Come di Django 1.2 è possibile utilizzare .exists() su un QuerySet, ma nelle versioni precedenti si può godere molto efficace trucco descritto nel this ticket.

Problemi correlati