2012-02-27 3 views
1

다음 코드는 사용자 지정 관리자를 모델에 추가하는 TranslatedContent 클래스의 일부입니다.Django는 런타임에 사용자 정의 관리자를 확장합니다. 믹스 인 스타일?

if hasattr(cls, 'objects'): 
    if cls.objects.__class__ == models.Manager: 
     # default manager, override 
     cls.add_to_class('objects', TranslationManager() 
    else: 
     # there is a custom manager, don't override 
     cls.add_to_class('translated', TranslationManager()) 

사용자 정의 관리자가 이미있는 경우 관리자에 대해 다른 이름을 사용합니다. (이 경우 '번역 된') 그것은 내가 원하는 것이 아닙니다.

어떻게 동일한 이름 ('objects')을 사용하고 TranslationManager()로 덮어 쓸 수 있습니까? 덮어 쓰기 대신 대체/연장이됩니다. 원래 관리자와 TranslationManager 사이에 발생할 수있는 특정 충돌, 네임 스페이스에 대해 매우 신중해야 할 필요가

if hasattr(cls, 'objects'): 
    if cls.objects.__class__ == models.Manager: 
     # default manager, override 
     cls.add_to_class('objects', TranslationManager() 
    else: 
     # there is a custom manager, don't override 
     class CombinedManager(cls.objects.__class__, TranslationManager): 
      pass 
     cls.add_to_class('objects', CombinedManager()) 

그러나 :

답변

1

당신은 같은 일을 할 수 있습니다. 일반적으로 사용자 정의 관리자에게 TranslationManager을 포함 시킬지 여부를 결정하기 위해 최종 사용자에게 맡기는 것이 가장 좋습니다.

사용자 정의 관리자가없는 경우에만 TranslationManager이 기본 관리자로 추가된다는 것을 문서에 넣는 것이 좋습니다. 그렇지 않은 경우 해당 기능을 사용하려면 사용자 지정 관리자가 TranslationManager에서 상속 받도록해야합니다.

+0

감사합니다. 그렇습니다. 문서 옵션을 사용하겠습니다. 맞춤 관리자가있는 경우 경고를 표시하는 것이 '완료되지 않았습니까?' –

+0

그것은 논쟁의 여지가 있습니다. 만약 당신이'TranslationManager'를 사용할 필요가 있고, 기본적으로 경고를 경고문으로 사용하는 것만 큼 중요하다면 (예를 들어 그들이 무시한 경우, 그들이 잊어 버린 이유는 그들이 선택하지 않았기 때문이 아닙니다. ~), 경고가 적절할 수 있습니다. 그렇지 않으면 혼자있는 것이 가장 좋습니다. –

관련 문제