2011-02-08 37 views
6

Ben queryset bir filtre uygulayacak bir queryset "zincir" yerleştirmek için özel bir işlev oluşturmaya çalışıyorum. Normal Django queryset filtreleriyle olduğu gibi, queryset'i soluna alır ve sonuçta ortaya çıkan queryset'i sağa taşır. QuerySet zincirine benim özel işlev ekledikten sonraDjango modeli bir işlev olarak queryset süzgeci

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

:

QuerySet zincirine benim özel işlev eklemeden önce

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

ben yapmak benim fonksiyonu inşa etmek nasıl emin değilim bu. Çevresinde bir çeşit dekoratör lazım mı?

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

kimse bunu gerçekleştirmek için iyi bir yol biliyor mu?

Aşağıdakiler işe yarayabilir, ancak biraz daha Django benzeri bir şey umuyordum.

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

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

Herhangi bir tavsiye çok takdir edilmektedir.

sayesinde Joe

GÜNCELLEME: Ben Ignacio'nun çözümün ayrıntıları halletmek çalışıyorum. Ben bu beklediğim şekilde çalışıyor sanmıyorum ... Ancak QuerySet ı bulmak mümkün olduğum şeyi birlikte bağlama ediyorum bu yüzden ağır basan çok fazla

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) 

yapmadık. Baska öneri?

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

GÜNCELLEME 2: Bu makale yararlı olduğunu kanıtladı. http://zmsmith.com/2010/04/using-custom-django-querysets/

+0

+1, bana da yardımcı oldu. –

cevap

4

Sen yöntem daha sonra use that class in the manager, katma ile kendi QuerySet çocuk sınıf yazmak gerekir. Update2 içindeki bağlantı için

+0

Tavsiyeniz için teşekkürler Ignacio. Yukarıdaki güncellemeleri yaptım. –