2014-07-07 2 views
0

체인 필터링을위한 여러 가지 메소드가있는 사용자 정의 QuerySet 오브젝트가 있습니다. 먼저 컨텍스트 설정입니다.장고 쿼리 세트를 비우는 방법

from django.db.models import Manager, Model 
from django.db.models.query import QuerySet 

class MyQuerySet(QuerySet): 
    def some_filter(self, foo): 
     return self.filter(some__chain__of__relationships__foo=foo) 

class MyModelManager(Manager): 
    def get_query_set(self): 
     return MyQuerySet(self.model, using=self._db) 

class MyModel(Model): 
    objects = MyModelManager() 

사용 케이스 :

qs = MyModel.objects.get_query_set() 
qs = qs.filter_by_name(name).filter_by_color(color).filter_by_date(date) 

나는 내 객체가 아닌 장고의 EmptyQuerySet의 빈의 검색어를 반환해야 할 상황이있다.

def filter_by_color(self, color): 
    if color.is_active: 
     return self.filter(some__chain__of__relationships__color=color) 
    return self.empty() 

.empty()은 어떻게 정의 할 수 있습니까? EmptyQuerySet에 .filter_by_date() 메서드가 없기 때문에 .filter_by_date(date)에서 오류가 발생하므로 .none()을 사용할 수 없습니다. 나는 많은 비 해킹 방법으로이 작업을 수행하는 것을 선호

def empty(self): 
    return self.filter(pk=0) 

: 저는 현재 해킹 where=['1=0']

def empty(self): 
    return self.extra(where=['1=0']) 

또는를 ... 사용하고 있습니다.

파이썬 방법은 내 사용자 정의 QuerySet 객체의 빈 쿼리 세트를 반환합니까?

답변

1

Django < = 1.5를 사용하는 경우 EmptyQuerySet 클래스와 자신 만의 사용자 정의 쿼 리셋 클래스를 하위 클래스로 만들 수 있습니다. 그냥 사용자 정의 클래스를 돌려 none()를 오버라이드 (override) :

장고 1.6, 귀하의 검색어의 클래스를 사용하면 none()를 호출하는 경우 여전히 동일하지만, 메타 클래스 및 최우선 __instancecheck__의 사용을 통해
class MyQuerySet(QuerySet): 
    def none(self): 
     # prevent circular import 
     from . import MyEmptyQuerySet 
     return self._clone(klass=MyEmptyQuerySet) 

class MyEmptyQuerySet(EmptyQuerySet, MyQuerySet): 
    pass 

, isinstance(qs.none(), EmptyQuerySet) 여전히 True를 반환합니다 호출. 따라서 Django 1.6에서는 커스텀 클래스 나 다른 것이 필요하지 않습니다. 커스텀 쿼리 세트 클래스의 새로운 메소드는 여전히 빈 쿼리 세트에서 사용할 수 있습니다.

+0

나는 이것이 두려웠을 수도 있습니다. 정말, 정말로 자신 만의'EmptyQuerySet'을 만들어야하는 것을 원하지 않았습니다, 그러나 그러한 것이 삶입니다. 감사. – Rico

0

지금 알 수있는 가장 간단한 방법입니다. 또는 체인 끝에있는 색상별로 필터링하십시오.

+0

이것은 너무 구체적인 사용 사례이며 필터가 연결될 순서를 알아야합니다. 필터의 일부 또는 전부가 EmptyQuerySet 객체를 반환 할 수 있다면 어떨까요? 이 구현은 충분히 일반적이지 않습니다. – Rico

관련 문제