Фильтр набора запросов модели Django как функция

Я пытаюсь создать настраиваемую функцию, которую я могу поместить в "цепочку" набора запросов, которая будет применять фильтр к набору запросов. Как и в случае с обычными фильтрами набора запросов Django, он будет брать набор запросов слева от него и передавать получившийся набор запросов справа.

Перед добавлением моей пользовательской функции в цепочку запросов:

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

После добавления моей пользовательской функции в цепочку запросов:

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

Любой совет очень ценен.

Спасибо, который применит фильтр к набору запросов. Как и в случае с обычными фильтрами набора запросов Django, он будет брать набор запросов слева от него и передавать получившийся набор запросов справа.

Перед добавлением моей пользовательской функции в цепочку запросов:

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

После добавления моей пользовательской функции в цепочку запросов:

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

Любой совет очень ценен.

Спасибо, который применит фильтр к набору запросов. Как и в случае с обычными фильтрами набора запросов Django, он будет брать набор запросов слева от него и передавать получившийся набор запросов справа.

Перед добавлением моей пользовательской функции в цепочку запросов:

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

После добавления моей пользовательской функции в цепочку запросов:

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

Любой совет очень ценен.

Спасибо,

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

После добавления моей пользовательской функции в цепочку запросов:

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

Любой совет очень ценен.

Спасибо,

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

После добавления моей пользовательской функции в цепочку запросов:

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

Любой совет очень ценен.

Спасибо, Джо

ОБНОВЛЕНИЕ : Я пытаюсь проработать детали решения Игнасио. Я не слишком много сделал с переопределением 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()

ОБНОВЛЕНИЕ 2 : Эта статья оказалась полезной. http://zmsmith.com/2010/04/using-custom-django-querysets/

6
задан Joe J 25 February 2011 в 19:53
поделиться