2011-02-08 12 views
6

Estoy tratando de crear una función personalizada que puedo colocar en un queryset "cadena" que aplicará un filtro al queryset. Al igual que con los filtros normales de Django queryset, llevará el queryset a la izquierda y pasará el queryset resultante a la derecha.Django queryS filtro de modelo como una función

Antes de añadir mi función personalizada a la cadena queryset:

models.MyModel.objects.all() 
models.MyModel.objects.some_manger_function() 
models.MyModel.objects.some_manger_function().count() 
models.MyModel.objects.some_manger_function().filter(title='something') 

Después de añadir mi función personalizada a la cadena queryset:

models.MyModel.objects.all().my_custom_filter() 
models.MyModel.objects.some_manger_function().my_custom_filter() 
models.MyModel.objects.some_manger_function().my_custom_filter().count() 
models.MyModel.objects.some_manger_function().my_custom_filter()\ 
    .filter(title='something') 

No estoy seguro de cómo construir mi función para hacer esta. ¿Necesita algún tipo de decorador a su alrededor?

???? def my_custom_filter(???): 
???? return qs.filter(id__gte=10) 

¿Alguien sabe una buena manera de lograr esto?

Lo siguiente podría funcionar, pero esperaba algo un poco más parecido al de Django.

def my_custom_filter(qs): 
    return qs.filter(id__gte=1) 

my_custom_filter(models.MyModel.objects.all()).count() 

Cualquier consejo es muy apreciado.

Gracias, Joe

ACTUALIZACIÓN: Estoy tratando de resolver los detalles de la solución de Ignacio. No he hecho demasiado con QuerySet anulando así que estoy reconstruyendo lo que yo soy capaz de encontrar ...

class MyQuerySet(QuerySet): 

    def filter(self, *args, **kwargs): 
     return super(self.__class__, self).filter(*args, **kwargs).\ 
        filter(id__gt=5) 


class MyManager(models.Manager): 

    def testqs(self): 
     return MyQuerySet(self.model) 

Sin embargo, no creo que esto está funcionando de la manera que esperaba. ¿Alguna sugerencia?

>>> models.MyModel.objects.testqs().filter() 

ACTUALIZACIÓN 2: Este artículo demostró ser útil. http://zmsmith.com/2010/04/using-custom-django-querysets/

+0

+1 para el enlace en la actualización 2, me ayudó también. –

Respuesta

4

Usted tendrá que escribir su propia clase QuerySet niño con el método añadió, a continuación, use that class in the manager.

+0

Gracias por su consejo Ignacio. He hecho actualizaciones arriba. –

Cuestiones relacionadas