2011-01-17 2 views
2

간단한 모델 MyModel의 날짜 필드는 publication_date입니다. 또한이 날짜 필드를 기반으로 내 모델을 필터링하는 사용자 지정 관리자가 있습니다.Django : get_previous_by_FOO()에서 사용자 정의 관리자를 사용하는 방법?

이 지정 관리자 .objects에 의해 기본 하나를 .published으로 액세스 할 수 있습니다.

from datetime import date, datetime 
from django.db import models 

class MyModelManager(models.Manager): 
    def get_query_set(self): 
     q = super(MyModelManager, self).get_query_set() 
     return q.filter(publication_date__lte=datetime.now()) 

class MyModel(models.Model): 
    ... 
    publication_date = models.DateField(default=date.today()) 

    objects = models.Manager() 
    published = MyModelManager() 

이 방법은, 내가 관리자의 모든 개체에 대한 액세스를 가지고 있지만 (MyModel.published.all()의 검색어를 사용) 내보기에 게시 된 것들.

은 내 템플릿에 사용

def get_previous(self): 
    return self.get_previous_by_publication_date() 

def get_next(self): 
    return self.get_next_by_publication_date() 

나는 또한 한 :

{{ object.get_previous }} 

문제를 사용하여 내가 이전 및 다음 객체에 링크 할 수있는 객체를 볼 때입니다 :이 이전 반환 기본 질문 모음 (개체)의 개체이며 내 사용자 지정 개체()가 아닙니다.

나는이 기본 모델 함수 (get_previous_by_FOO)에서 내 사용자 정의 관리자를 사용하여 어떻게 말할 수 있는지 궁금합니다. 또는 가능하지 않은 경우 다른 솔루션을 사용하여 동일한 작업을 수행하는 방법

미리 조언 해 주셔서 감사합니다.

편집

이 뷰는 일반 뷰에서 object_detail 사용하여 내 urlconf에서이 방법이라고합니다.

(r'^(?P<slug>[\w-]+)$', object_detail, 
    { 
    'queryset': MyModel.published.all(), 
    'slug_field': 'slug', 
    }, 
    'mymodel-detail' 
), 

저는 장고 1.2를 사용하고 있습니다.

+0

{{object.get_previous}}가 포함 된 템플릿을 렌더링하는 뷰에서 어떤 쿼리 세트를 사용하고 있습니까? 아마 문제가 거기에있다. –

+0

내 커스텀 매니저와 함께 일반 뷰 (django 1.2)를 사용한다. 이것은 이것을 사용하지 않습니다. – daks

+0

urlconf를 보여줄 수 있습니까? 보기를 참조하는 곳 –

답변

1

실제로 get_next_or_previous_by_FIELD() 장고 함수 (get_previous_by_publication_date ...에서 사용)는 default_manager를 사용합니다.

그래서 나는 내가 검색어 세트 및 사용 분야를 하드 필요로 이것은, 매우 깨끗한 해결책이 아니라 내 자신의 효용 함수

def _own_get_next_or_previous_by_FIELD(self, field, is_next): 
    if not self.pk: 
     raise ValueError("get_next/get_previous cannot be used on unsaved objects.") 
    op = is_next and 'gt' or 'lt' 
    order = not is_next and '-' or '' 
    param = smart_str(getattr(self, field.attname)) 
    q = Q(**{'%s__%s' % (field.name, op): param}) 
    q = q|Q(**{field.name: param, 'pk__%s' % op: self.pk}) 
    qs = MyModel.published.filter(q).order_by('%s%s' % (order, field.name), '%spk' % order) 
    try: 
     return qs[0] 
    except IndexError: 

def get_previous(self): 
    return self._own_get_next_or_previous_by_FIELD(MyModel._meta.fields[4], False) 

def get_next(self): 
    return self._own_get_next_or_previous_by_FIELD(MyModel._meta.fields[4], True) 

을 재 구현하는 데 적응,하지만 적어도 작동합니다.

관련 문제