2011-02-08 14 views
6

Sto provando a creare una funzione personalizzata che posso inserire in una "catena" di queryset che applicherà un filtro al queryset. Come con i normali filtri di queryset di Django, prenderà il queryset a sinistra di esso e passerà il queryset risultante a destra.Filtro del set del modello Django come funzione

Prima di aggiungere la mia funzione personalizzata per la catena set di query:

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') 

Dopo aver aggiunto la mia funzione personalizzata per la catena set di query:

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') 

Non sono sicuro di come costruire la mia funzione di fare Questo. Ha bisogno di una sorta di decoratore intorno ad esso?

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

Qualcuno sa un buon modo per ottenere questo risultato?

Quanto segue potrebbe funzionare, ma speravo in qualcosa di un po 'più simile a Django.

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

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

Qualsiasi consiglio è molto apprezzato.

Grazie, Joe

UPDATE: Sto cercando di capire i dettagli della soluzione di Ignacio. Io non ho fatto troppo con QuerySet ignorando così sto mettendo insieme quello che sono in grado di trovare ...

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) 

Tuttavia, non credo che questo sta funzionando il modo in cui mi aspetto. Eventuali suggerimenti?

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

UPDATE 2: questo articolo si è rivelato utile. http://zmsmith.com/2010/04/using-custom-django-querysets/

+0

+1 per il collegamento in update2, mi ha aiutato anche. –

risposta

4

Avrete bisogno di scrivere una classe QuerySet bambino con il metodo aggiunto, quindi use that class in the manager.

+0

Grazie per il tuo consiglio Ignacio. Ho effettuato aggiornamenti sopra. –

Problemi correlati