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/
+1, bana da yardımcı oldu. –