2009-03-23 17 views
6

¿Existe, en Django, una forma estándar de escribir filtros complejos y personalizados para QuerySets?Filtros de Django Custom Queryset

Del mismo modo que puedo escribir

MyClass.objects.all().filter(field=val) 

me gustaría hacer algo como esto:

MyClass.objects.all().filter(customFilter) 

que podría utilizar una expresión generadora

(x for x in MyClass.objects.all() if customFilter(x)) 

pero que iba a perder la capacidad de ser utilizada y cualquier otra función que proporcione el QuerySets.

Respuesta

5

Creo que es posible que necesite personalizar managers.

+0

Supongo que necesito esto. Pero parece terriblemente complicado en comparación con solo poder pasar una función de filtro sobre la marcha. – interstar

+0

No es muy complicado, y es una buena práctica crear administradores personalizados, especialmente si planea almacenar cosas en caché desde db, etc. – Vasil

13

La recomendación de comenzar a usar los métodos de administrador es buena, pero para responder a su pregunta más directamente: sí, use Q objects. Por ejemplo:

from django.db.models import Q 

complexQuery = Q(name__startswith='Xa') | ~Q(birthdate__year=2000) 

MyModel.objects.filter(complexQuery) 

Objetos Q se pueden combinar con | (O), & (AND) y ~ (NO).

Cuestiones relacionadas