2012-08-10 7 views
2

비슷한 필드가 15 개있는 모델을 만들어야합니다 (field_01, field_02, field_03 등). 또한이 필드를 쉽게 사용할 수 있어야합니다 (예 : obj.field_01과 같은 일을 할 수 있도록).django 모델의 반복 필드

class M (models.Model): 
    .... 
    field_01 = models.NullBooleanField() 
    field_02 = models.NullBooleanField() 
    .... 

내가이 일을 더 나은 방법을 온라인으로 검색 : 정말 빨리지면에서 무언가를 얻을 싶었 기 때문에, 난 그냥 그들에게 바보 같은 방법을 만들었습니다. 어떤 사람들은 setattr을 사용한다고 말합니다.하지만 읽는 것으로 말하면, 클래스 자체가 아닌 클래스의 인스턴스에 속성을 추가합니다. 즉, 모델 양식을 첨부하려고 할 때 이 모델에서는 setattr으로 추가 된 입력란을 볼 수 없습니다. 그런 다음 __new__ 함수를 재정의하여 해당 클래스의 인스턴스를 만들기 전에 클래스에 속성을 추가 할 수있었습니다. 그러나 나는 정확하게 이것을하는 방법을 알아낼 수 없었다.

그렇다면 South 및 모델 양식을 손상시키지 않고 복사하여 붙여 넣지 않고 이러한 필드를 생성하는 방법은 무엇입니까?

답변

3

그것은 당신이 자신 필드를 반복 찾을 경우, 일반적으로하지만, 무엇을 당신의 일을 구체적인 예 않고 확실히 말할 어렵다, 그것은에 대한 명확한 징조 일대 다 또는 다 대다 대신 관계 :

일대

class Field(models.Model): 
    m = models.ForeignKey(M, related_name='fields') 
    field = models.NullBooleanField() 

대다

class Field(models.Model): 
    field = models.NullBooleanField() 

class M(models.Model): 
    fields = models.ManyToManyField(Field) 
+0

는이 같은 일을 결국. 감사! – Ciprian

+0

@ChrisPratt 저는 크리스 프라트 배우가 아니라는 것에 영원히 실망합니다. 작은 크기에서 당신의 아바타는 그와 비슷하게 보이며 배우의 생각은 프로그래밍 보드에서 그렇게 높은 순위를 갖는 것이 좋습니다. –

1

장고 모델은 add_to_class 방법을 사용하여 원하는 방식으로 원숭이 패치 모델에 사용할 수 있습니다.

for i in range(1, 10): 
    M.add_to_class('field_%s' % s, NullBooleanField()) 
0

EAV 스타일 데이터베이스를 찾고있는 것처럼 들립니다. 자신 만의 라이브러리 대신 라이브러리를 사용해보십시오. 이를 위해 Django EAV는 꽤 멋지게 보입니다. https://github.com/mvpdev/django-eav

이 체크 아웃 달성하기 위해 도서관의 한 무리의 장단점에 대한 자세한 내용을 읽으려면 : https://stackoverflow.com/a/7934577/884453