2009-04-28 10 views
0

모델 필드의 이름을 동적으로 정의 할 수 있습니까?

이제이 코드가 있습니다.

class Mymodel(models.Model): 
    xxxx_count = ForeignCountField(filter={'foreign_table__xxxx': True}) 
    yyyy_count = ForeignCountField(filter={'foreign_table__yyyy': True}) 
    zzzz_count = ForeignCountField(filter={'foreign_table__zzzz': True}) 
    qqqq_count = ForeignCountField(filter={'foreign_table__qqqq': True}) 
    ssss_count = ForeignCountField(filter={'foreign_table__ssss': True}) 
    rrrr_count = ForeignCountField(filter={'foreign_table__rrrr': True}) 

다음과 같이합니다.

class Mymodel(models.Model): 
    for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']: 
     setattr(self, '%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True})) 

그러나 이렇게하려고하면 오류가 발생합니다. "자체 정의되지 않았습니다." 이 코드를 다른 장소에 넣어야합니까?

답변

1

이 필드를 당신이 add_to_class 모델 방법을 사용할 필요가 외부 모델 정의에 추가하려면 :

class Mymodel(models.Model): 
    pass 

for code in ['xxxx','yyyy','zzzz','qqqq','ssss','rrrr']: 
    Mymodel.add_to_class('%s_count' % code, ForeignCountField(filter={'foreign_table__%s' % code: True}))) 
+0

아주 좋은 지적은, 나는이 방식을 잊어 버렸다. (장고가 추상적 모델 상속을 가졌던 이래로 나는 그렇게 오래 있었어. 이것은 아마도 메타 클래스를 작성하는 것보다 나은 해결책 일 것입니다. –

+0

그래, 잘된거야. 단 한 가지 나쁜 점, 코드의 두 가지 다른 위치에있는 해당 필드의 정의 : 내부 및 외부 클래스. – ramusus

-1

아마도 코드의 생성자 메소드 클래스에 코드를 넣어야합니다.

def __init__(self, *args, **kwargs): 
    ..... 
    super(MyModel, self).__init__(*args, **kwargs) 

편집 : 죄송합니다 이이을 작동하지 않습니다. 어쩌면 당신은 This, 'django 0.96 작동합니다보십시오 시도 할 수 있습니다. django 버전 1.0으로 조정하기 어려운 몇 가지 수정이 있습니다. '

당신이 더러운 및 빠른 당신이 이런 식으로 뭔가를 시도 할 수 wan't 경우 :

class Foo(models.Model): 
    letters = ["A", "B", "C"] 
    for l in letters: 
     exec "%s_count = models.CharField(max_length=255)" % l 
+0

무엇 __init의 __ 내부에 정의 사이의 차이() 또는 외부 __init__을(). 자기 변이의 유일성? – ramusus

+0

예, __init__ 자체 안에 존재하지 않습니다. –

+0

답장을 업데이트했습니다. –

1

방법은 여러 클래스의 생성을 자동화하는 속성 메타 클래스를 작성하는 것입니다. Django의 ModelBase 메타 클래스를 서브 클래스 화하고 필요한 기능을 추가 할 수 있습니다. 그러나 그것도 지나치게 많을 것이고 아마도 그것을 쓰는 것보다는 유지하기가 쉽지 않을 것이다.

1

이 점에 대해 알려 준 디자인 결정에 대해 좀 더 알고 싶습니다. ForeignCountField 란 무엇이며 왜 필요합니까? 각 테이블의 속성이되어서는 안됩니까? (관리자 또는 classmethod의 방법은?)

+0

훌륭한 질문입니다. 나는 거의 이것을 요구했지만, ForeignCountField를 쓰는 데 어려움을 겪는 사람은 아마도 그들이하고있는 일을 알고 있고 비정규 화를 필요로한다고 생각했다. –

+0

필자는 같은 원리로 작성된 6 개의 비정규 화 필드를 가지고 있으며이를 지원할 수있는 확장 가능한 방법을 원합니다. 나는 7 번째 동일한 필드가 매순간 나타날 수 있다고 느낀다. – ramusus

관련 문제