2013-08-08 6 views
1

저는 현재 각 레코드에 많은 정보 (50-60 필드 정도)가 많은 클라이언트를위한 앱을 만들고 있습니다.복잡한 Django 모델 구성

데이터를 좀 더 구조화 할 수 있도록 모델을 섹션으로 나누고 싶습니다.

내 첫 번째 시도는 다음과 같이 뭔가를 할 수 있습니다 :

class Program(models.Model): 
    class BookingInformation(models.Model): 
     program = models.OneToOneField('Program', related_name='booking_information') 

     producer = models.CharField(max_length=100, blank=True) 
     producer_phone = models.CharField(max_length=30, blank=True) 

     ... 

    class Editorial(models.Model): 
     program = models.OneToOneField('Program') 

     series = models.CharField(max_length=100, blank=True) 

     ... 

나는 5 개 정도 섹션을 가지고 있으며 그들 중 일부는 중첩됩니다.

이 방법을 사용하면 프로그램 개체를 가질 수 있으며 해당 필드에 접근하려면 program.booking_information.producer을 수행하십시오. 또한 ModelForm을 사용하여 각 섹션에 대해 별도의 양식을 제공 할 수 있습니다 (원하는 내용).

개체를 만들 때 어려움이 발생합니다. 프로그램 개체를 만들 때 Program.BookingInformation 개체가 아직 존재하지 않기 때문에 먼저 기본 키를 가져 와서 프로그램을 저장하지 않고 만들 수 없습니다. 그리고 나서 그들은 절대적으로 필요한 것이 아닌 this which appear to discourage the use of OneToOneFields과 같은 것을 읽습니다.

하나의 모델에 전체를 넣어야합니까? 이 모든 분야를 가진 큰 테이블 하나를 가지고있는 것이 지저분 해 보입니다. 그렇지만이 데이터베이스에 대해 상당히 새로운 것입니다.

+0

[Python의 Zen] (http://www.python.org/dev/peps/pep-0020/) - 평면이 중첩 된 것보다 낫습니다. 또한 중첩 모델이 실제로 필요한지는 의심 스럽습니다. – karthikr

+0

@karthikr 이유를 정교하게 신경 쓰시겠습니까? – joerick

+0

모델이 얼마나 복잡한 지 상관없이 중첩 모델이 필요하지 않습니다. 다시 생각해보고 평면 구조를 만들 수 있습니다. 응용 프로그램/모델을 보지 않고 변경해야 할 내용을 말하기는 어렵습니다. – karthikr

답변

1

데이터베이스 수준에서는 단일 모델과 관련된 일대일 데이터에 대해 별도의 테이블을 사용하는 것은 좋지 않은 생각입니다. 이러한 별도의 테이블을 쿼리하면 쿼리 양이 두 배가되므로 응용 프로그램이 느려지고 이러한 모델의 사용이 복잡해집니다. 일반적으로 가능한 한 적은 수의 쿼리 만 남길 수 있습니다. 수 무엇

는, 당신이 모두 상속 별도의 추상적 인 모델로 데이터의 서로 다른 '그룹'을 나눌 수 있습니다 : 그것은 당신의 코드는 단지 작은 좀 더 읽기 쉽게 만들 수

class BookingInformation(models.Model): 
    # fields 

    class Meta: 
     abstract = True 

class Program(BookingInformation, Editorial, etc.): 
    pass 

,하지만 난 돈 이 작업에 분명한 이점이 있습니다. 모델에 고급 논리가 필요한 경우 문제가 발생할 수 있습니다. 모든 것을 하나의 클래스에 넣고 빈 줄과 주석 등이있는 그룹을 시각적으로 구분할 것을 제안합니다. 모델의 모든 필드 null=True이 있거나하는 경우

class BookingInformationForm(forms.ModelForm): 
    class Meta: 
     fields = ['producer', 'producer_phone', etc] 

이 가장 필요하다 :

원하는 별도의 양식을 얻으려면, 당신은 각각 자신의 fields 옵션은 정의가 여러 ModelForm 클래스를 지정할 수 있습니다 blank=True, 특정 필드에 따라 모델 필드의 하위 집합 만있는 폼으로 모델을 만들 때 문제를 방지 할 수 있습니다.

+0

추상 클래스의 다중 상속에 대해 생각해 보았습니다. 그러나 데이터를 확인하는 메소드를 작성해야하는 경우, 난 혼란 스럽습니다. 다른 부분들. 그것은 거대한 테이블이다! – joerick