Я пытаюсь создать пользовательскую функцию, которую я могу разместить в цепочке запросов, которая будет применять фильтр к набору запросов. Как и в обычных фильтрах запросов Django, он будет выбирать запрос слева от него и передать результирующий запрос вправо.Django model queryset filter как функция
Перед добавлением моей пользовательской функции в 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')
После добавления моей пользовательской функции в 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')
Я не уверен, как построить свою функцию, чтобы сделать это. Нужен ли какой-нибудь декоратор вокруг него?
???? def my_custom_filter(???):
???? return qs.filter(id__gte=10)
Кто-нибудь знает, как это сделать?
Следующие могут работать, но я надеялся на что-то более похожее на Django.
def my_custom_filter(qs):
return qs.filter(id__gte=1)
my_custom_filter(models.MyModel.objects.all()).count()
Любые советы очень ценятся.
Спасибо, Джо
UPDATE: Я пытаюсь работать над деталями решения Игнасио. Я не сделал слишком много с QuerySet перекрывая таким образом я склеиванием, что я смог найти ...
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)
Однако, я не думаю, что это работает так, как я ожидал. Какие-либо предложения?
>>> models.MyModel.objects.testqs().filter()
UPDATE 2: Эта статья оказалась полезной. http://zmsmith.com/2010/04/using-custom-django-querysets/
+1 для ссылки в update2, тоже помог мне. –