2011-02-08 3 views
6

Я пытаюсь создать пользовательскую функцию, которую я могу разместить в цепочке запросов, которая будет применять фильтр к набору запросов. Как и в обычных фильтрах запросов 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/

+0

+1 для ссылки в update2, тоже помог мне. –

ответ

4

Вам нужно будет написать свой собственный класс QuerySet ребенка с добавленным методом, то use that class in the manager.

+0

Спасибо за ваш совет Игнасио. Я сделал обновления выше. –

Смежные вопросы