2010-12-09 4 views
0

하나의 간단한 쿼리에서 사용자 계정을 검색하고 특정 사용자가 '테마'를 검색하는 스크립트를 만들려고합니다. 여기에 내가 사용하고있는 코드가의 get_account 방법에 유의하십시오 : 그것은,하지만 경우 '테마'객체가 null를 돌려 어떤 이유에서 잘 작동Django - 쿼리 실패시 기본값 사용

class AccountManager(Manager): 
    def __init__(self, *args, **kwargs): 
     super(AccountManager, self).__init__(*args, **kwargs) 

    def get_account(self, slug): 
     return get_object_or_404(self.select_related('theme'), status__exact=self.model.ACTIVE_STATUS, slug__exact=slug) 

(이런 일이 안됩니다을하지만 확신 할 싶어!) 404 페이지로 리디렉션됩니다. 내가 원하는 것은 테마 객체가 존재하고 유효한지 확인하는 것입니다. 그렇지 않은 경우 표준 테마를 기본값으로 사용합니다.

사용자 계정이 유효하지 않은 경우 쿼리를 404 발생시키는 것이 좋습니다. try/exceptions 버킷로드를 사용하지 않아도된다.이 작업을 수행하는 좋은 방법이 있습니까? 나는 그것이 대상이 아닌 것처럼 :)

희망 누군가가 관련 테마가 null의 경우는 404 초래하지 않을 당신의 예에서

답변

1
try: 
    account = self.select_related('theme').get(
       status__exact=self.model.ACTIVE_STATUS, slug__exact=slug 
      ) 
except self.model.DoesNotExist: 
    account = self.select_related('theme').get(slug="default_slug") 

return account 
+0

안녕하세요, 귀하의 회신에 감사드립니다. 아마 나는 내 포스트에서 명확하지 않았지만, '테마'모델의 DoesNotExist, 계정 모델이 없으면 404를 던져 버릴 때 기본값으로 갈 수 있기를 원합니다. – Hanpan

0

을 도울 수있는 좋은 깔끔한 내 관리자를 유지하려면 get_object_or_404()로 검색 중입니다. 인 ACTIVE_STATUS와 일치하는 슬러그 인 계정 개체를 찾을 수없는 경우에만 404가됩니다.

나의 제안은 유효한 계정 개체의 기본 테마를 사용 보장은 다음과 같습니다

class AccountManager(Manager): 
    def __init__(self, *args, **kwargs): 
     super(AccountManager, self).__init__(*args, **kwargs) 

    def get_account(self, slug): 
     account = get_object_or_404(self.select_related('theme'), status__exact=self.model.ACTIVE_STATUS, slug__exact=slug) 
     if not account.theme: 
      account.theme = default_theme_obj 
     return account 
나는 모델을 모르는 당신이 default_theme_obj을 얻을 것입니다 방법을 결정하는 당신에게 그것을 떠날거야

, 캐싱 구조와 이것 저것.

관리자가 깔끔하게 유지할 수 있도록 기본값이 적용되지 않는 작업을 수행하지 않으므로 __init__ 메서드가 필요하지 않습니다.