2011-01-18 19 views
5
employee = Employee.objects.filter('age' = 99) 

Supponiamo che questo set di query sia vuoto.Django; è possibile avere un valore predefinito per queryset

Se utilizzo employee[0], restituirà l'errore di indice fuori intervallo, quindi è possibile avere un valore predefinito Nessuno come qui?

`employee[0] or None`? # This won't work, but this is what I mean. 
+0

BTW, prova a non provare a bloccare il blocco. – user469652

+0

http://stackoverflow.com/questions/4722375/how-to-represent-and-in-django-orm-query..... dovresti modificare le tue vecchie domande invece di chiederne di nuove – crodjer

risposta

9

se si desidera solo per ottenere una singola istanza, utilizzare get, non filter:

employee = Employee.objects.get(age = 99) 

Se questo non esiste , riceverai un'eccezione Employee.DoesNotExist, che dovrai catturare. Se c'è più di un dipendente di 99 anni, riceverai un'eccezione Employee.MultipleObjectsReturned, che potresti voler rilevare.

C'è sempre django-annoying 's get_object_or_None se ti senti pigro!

from annoying.functions import get_object_or_None 

obj = get_object_or_None(Employee, age=99) 

Se non si desidera utilizzare tutti django-fastidioso, si può sempre aggiungere get_object_or_None da qualche parte, sembra proprio così:

def get_object_or_None(klass, *args, **kwargs): 
    """ 
    Uses get() to return an object or None if the object does not exist. 

    klass may be a Model, Manager, or QuerySet object. All other passed 
    arguments and keyword arguments are used in the get() query. 

    Note: Like with get(), a MultipleObjectsReturned will be raised if 
    more than one object is found. 
    """ 
    queryset = _get_queryset(klass) 
    try: 
     return queryset.get(*args, **kwargs) 
    except queryset.model.DoesNotExist: 
     return None 
3

Questo dovrebbe funzionare:

employee[0] if employee else None 
+0

Penso che sia lo stesso come dipendente [0] o Nessuno, causerà un indice fuori intervallo. – user469652

+2

No, non lo è. Sta calcolando il valore del dipendente [0] solo se il dipendente ha un valore True. Empty QuerySet è un valore falso, quindi se hai QuerySet vuoto, otterrai None. – ikostia

1
first_employee = employee[0] if employee.count() > 0 else None 
+2

Questo è male. Non sono sicuro che funzioni, ma anche se si ottengono due query SQL al database: una per il conteggio e una per il dipendente stesso. Django QuerySet è pigro, quindi viene calcolato solo quando cerchi di recuperare i dati per la prima volta. In questo caso stai cercando di farlo scrivendo employee.count(). Django passa la query "SECELE COUNT() FROM ..." al tuo database e ti restituisce un numero. Ma quando provi a fare un impiegato [0], Django deve interrogare il database ancora una volta! (O non riesco affatto, non sono sicuro). Ad ogni modo, questo è un pessimo modo di implementare una funzionalità così semplice. – ikostia

3

Su Django> = 1.6 c'è il metodo first , quindi si può solo fare:

employee = Employee.objects.filter(age=99).first() 

si noti, tuttavia, che questo ha senso solo se si conosce il QuerySet è garantito per restituire 1 o 0 risultati.

Problemi correlati