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

Suponemos que este conjunto de consulta está vacío.Django; es posible tener un valor predeterminado para el conjunto de consulta

Si uso employee[0], eso devolverá el índice fuera de rango de error, entonces ¿es posible tener aquí ninguno como valor predeterminado?

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

Por cierto, intente evitar try catch block. – user469652

+0

http://stackoverflow.com/questions/4722375/how-to-represent-and-in-django-orm-query.....usted debería editar sus viejas preguntas en lugar de preguntar las nuevas – crodjer

Respuesta

9

Si lo que desea es obtener una sola instancia, utilizar get, no filter:

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

Si eso no existe , obtendrá una excepción Employee.DoesNotExist, que deberá atrapar. Si hay más de un empleado de 99 años, recibirá una excepción Employee.MultipleObjectsReturned, que es posible que desee atrapar.

¡Siempre hay django-annoying de get_object_or_None si te sientes flojo!

from annoying.functions import get_object_or_None 

obj = get_object_or_None(Employee, age=99) 

Si no desea utilizar todos django-molesto, siempre se puede añadir get_object_or_None en alguna parte, que sólo se ve así:

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

Esto debería funcionar:

employee[0] if employee else None 
+0

Creo que esto es lo mismo como empleado [0] o Ninguno, causará índice fuera de rango. – user469652

+2

No, no lo es. Se trata de calcular el valor del empleado [0] solo si el empleado tiene el valor True-like. Empty QuerySet es un valor falso, por lo que si tiene QuerySet vacío, obtendrá None. – ikostia

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

Esto es malo. No estoy seguro de si funciona en absoluto, pero incluso si es así, obtienes dos consultas SQL a la base de datos: una para el recuento y otra para el propio empleado. Django QuerySet es flojo, por lo que se computa solo cuando intenta obtener datos por primera vez. En este caso, intenta hacer esto mientras escribe employee.count(). Django pasa la consulta "SECELE COUNT() FROM ..." a su base de datos y le devuelve un número. ¡Pero cuando tratas de hacer el empleado [0], Django tiene que consultar la base de datos una vez más! (O fallar en absoluto, no estoy seguro). De todos modos, esta es una muy mala manera de implementar una funcionalidad tan fácil. – ikostia

3

En Django> = 1.6 está el método first , por lo que sólo puede hacer:

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

Tenga en cuenta, sin embargo, que esto sólo tiene sentido si se conoce el QuerySet está garantizada para devolver 1 o 0 resultados.

Cuestiones relacionadas