2011-02-08 7 views
6

queryset에 필터를 적용 할 쿼리 세트 "chain"에 배치 할 수있는 사용자 정의 함수를 만들려고합니다. 보통 Django queryset 필터와 마찬가지로, queryset을 왼쪽으로 가져 와서 결과 집합을 오른쪽으로 전달합니다. 의 검색어 체인에 내 사용자 지정 기능을 추가 한 후Django 모델 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') 

:

의 검색어 체인에 내 사용자 지정 기능을 추가하기 전에

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(qs): 
    return qs.filter(id__gte=1) 

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

모든 조언을 주시면 감사하겠습니다.

감사합니다, 조

UPDATE : 나는 이그나시오의 솔루션의 세부 사항을 해결하기 위해 노력하고있어. 나는이 내가 예상 한대로 작동하고 생각하지 않는다, 그러나 ... 검색어 세트는 내가 찾을 수있어 무엇을 조립할거야 그래서 무시로 너무 많은

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/

+0

+1은 update2의 링크에도 도움이되었습니다. –

답변

4

QuerySet 자식 클래스를 추가하고 그 다음에 use that class in the manager 자식 클래스를 작성해야합니다.

+0

이그나시오에게 조언 해 주셔서 감사합니다. 위의 업데이트를 만들었습니다. –

관련 문제