2010-06-15 9 views
3

안녕하세요 - 오늘 이상한 문제가 나에게 발생했습니다장고 모델 클래스 및 사용자 지정 속성

내가 장고에 modle 클래스를 가지고 표현되지 않고, 따라서 데이터베이스에 저장하지 않는다 그것에 사용자 정의 속성을 추가 내가 쉘 또는 테스트를 작성 내에서 그리고 난 할 때

이제
class Category(models.Model): 
    groups = models.ManyToManyField(Group) 
    title = defaultdict() 

, 다음 : 모델 구조에

c1 = Category.objects.create() 
c1.title['de'] = 'german title' 
print c1.title['de'] # prints "german title" 

c2 = Category.objects.create() 
print c2.title['de'] # prints "german title" <-- WTF? 

'제목이'세계의 종류 것 같다. 제목을 간단한 문자열로 변경하면 예상대로 작동하므로 사전과 무언가를해야합니까? 나는 또한 부동산으로 제목을 설정하려고 시도 :

그러나 그 역시 효과가 없었다. 그럼 어떻게 해결할 수 있을까요? 미리 감사드립니다.

편집 : 을 우리의 모델 구조에서 우리는 번역을 저장하는 모델 클래스가 : 여기

는 요청에 따라 당신에게 환경을 둘러싼 전체에 대한 더 나은 모습을 제공하는 기본 문제의 의도이다. 이 클래스는 서로간에 관계가있는 다른 모든 클래스에서 언 바운드됩니다. 번역 클래스는 번역 된 값, 언어 키, 번역 키 및 번역이 속한 패키지와 클래스를 저장합니다. 일부 모델 클래스는 다른 언어로 번역 할 수있는 속성을 가질 수 있습니다. 이러한 속성은 장고 모델 구조 내에서 매핑되지 않습니다. 왜냐하면 이것이 우리 눈에 실제로 존재하지 않기 때문입니다. 번역 가능한 속성을 가진 각 클래스는 translateable을 호출하고 하나 이상의 속성을 가질 수 있습니다. 이것이 바로 번역 키입니다. 예 : 번역 가능한 속성 "title"이있는 클래스 Category가 있으면 모델 번역에서 package/class로 "module.somewhere.Category"를, 번역 키로 "title"을 저장합니다. 독일어는 번역 값 "Kategorie"와 언어 키 "de". 내 목표는이 속성에 대한 액세스를 용이하게하는 것입니다. 따라서이 모든 모델 클래스는 "Translatable"이라는 일반 클래스를 상속합니다. 클래스의 모듈 경로와 이름 (나중에 변환 데이터베이스 테이블에 저장하기 위해)과 속성의 이름을 취하는 "_propertize"메소드를 분석하는 메소드가 있습니다. Propertize는 번역 가능한 각 속성 이름에 대해 고유 한 "Translator"클래스를 인스턴스화합니다. 이 클래스는 번역 모델 클래스의 실제 번역 값을 해석하고 현재 선택한 언어의 번역을 자동으로 해결하기위한 몇 가지 작업을 수행합니다.

답변

6

그렇게하지 마십시오. title 속성은 완전히 "전역"입니다. 그것은 클래스의 일부이며 각 인스턴스의 일부가 아닙니다.

다음과 같이하십시오. 당신이 당신의 실제 사용 사례를 정의 할 수 있다면

class Category(models.Model): 
    groups = models.ManyToManyField(Group) 
    @property 
    def title(self): 
     return self._title 
    def save(self, *args, **kw ): 
     try: 
      self._title 
     except AttributeError: 
      self._title= defaultdict() 
     super(Category, self).save(*args, **kw) 

,이 많은 단순화 할 수 수 있습니다.

+0

글쎄 고마워요. 그러나 당신의 예제에서 self._title을 어떻게 정의 할 수 있습니까? 실제 사용 사례가 약간 이상합니다. 원칙적으로 번역 가능한 속성을 가진 모델 클래스가 있습니다. 이 소품을 모델에 직접 넣을 수는 없습니다. 예를 들어 Category Category에 6 개의 다른 언어로 된 필드 제목이있을 수 있습니다. 클래스는 이러한 변환 가능한 속성 중 둘 이상을 가질 수도 있습니다. Translatable 각 modelclass 클래스는 특성에 연결된 사전이있는 메소드가있는 모델 (Model.Model에서도 상속 받음)을 상속받습니다. – dArignac

+0

@dArignac : 당신은 아무것도 정의하지 않습니다. '자기._title'은 인스턴스에 기본 사전을 저장합니다. 파이썬에서는 아무것도 정의되어 있지 않습니다. Django의 "definitions"필드는 클래스가 생성 될 때 속성과 메소드를 비밀리에 만듭니다. –

+0

@dArignac : "제 실제 유스 케이스가 약간 이상합니다 ..."실제 유스 케이스로 질문을 업데이트하십시오. ** 세부 사항 **을 포함시키고, ** 구체적으로 ** 기재하십시오. 그리고 질문을 업데이트하십시오. –

관련 문제