2013-12-12 1 views
1

두 명의 교사와 학생 모델이 있습니다. 나는 또한 두 가지 모델을 더 가지고 있는데, 여기서 수업은 실제 주제이고 수업은 학생들을 나누는 데 익숙하다. 나는 다음과 같은 관계를 만들고 싶습니다. ManyToManyField 통과 및 DatabaseIntegrity 보장

A student attends a class with a specific lesson e.g George is taking Python in C3 

A teacher teaches a specific lesson in a specific class e.g Mike teaches python in C3 

정도로 eventualy
George is Mike's student in python in C3 

난 중간 모델을 사용하는 두 모델에서 manytomany 필드를 사용했다.

class Teacher(models.Model): 
    teaches = models.ManyToManyField(Class, through=TeacherTeaches) 

class TeacherTeaches(models.Model): 
    teacher = models.ForeignKey(Teacher) 
    class = models.ForeignKey(Class) 
    lesson = models.ForeignKey(Lesson) 

및 위해 : 교사는 그가 많은 교훈을 가르 칠 수있는 많은 클래스를 가질 수 있고 클래스가 많은 교사 (학생 같은) 다른 교훈을 가르치는

이있을 수 있기 때문에 많은에 많은 그래서 나는 다음과 같은했다 학생 :

class Student(models.Model): 
    attends = models.ManyToManyField(Class, through=StudentAttends) 


class StudentAttends(models.Model): 
    student = models.ForeignKey(Student) 
    class = models.ForeignKey(Class) 
    lesson = models.ForeignKey(Lesson) 

하지만 (같은 교훈이 있기 때문에 외래 키의 올바른 두 개의 서로 다른 교사에 의해 같은 클래스에서 강의되지 않았는지 확인하는 것입니다 그것은이 구현 할 수없는 생각하는지? 나는 생각한다). 위의 동작을 달성하기 위해 내 모델을 "설정"하는 더 좋은 방법이 있습니까? 두 개의 중간 모델을 통합해야합니까?

답변

2

다차원 관계를 제한하려면 다른 방향에서 접근해야 할 수도 있습니다. 클래스 (또는 방, 당신이 식별자로 키워드 class를 사용할 수 없기 때문에) 만 그렇게 하나의 교훈 한 교사 수 : 단 하나 개의 방에 교사가 여러 교훈을 가르 칠 수

class Room(Model): 
    teacher = ForeignKey(Teacher) 
    lesson = ForeignKey(Lesson) 

하지만,을, 그래서이 이미 예를 들어, Room 모델에서 조회 할 수 있습니다 :

Teacher.objects.select_related().values('lesson') 

학생은 여러 교훈, 객실과 교사를 가질 수 있기 때문에 다 대다 관계를 피하는 방법이 아니라, 교훈 및 선생님은 이미 방과 관련이 있으므로 방을 가지고 다 대다를 만드는 것이 가장 간단한 방법입니다. 이것은 양쪽에서 수행하기 때문에 모델이 될 수있다 : 교사와 수업 고유 보장, 이제

class Room(Model): 
    teacher = ForeignKey(Teacher) 
    lesson = ForeignKey(Lesson) 
    students = ManyToManyField(Student) 

을 적절한 제약 추가로 간단하다 :

class Room(Model): 
    teacher = ForeignKey(Teacher) 
    lesson = ForeignKey(Lesson) 
    students = ManyToManyField(Student) 

    class Meta: 
     unique_together = ('teacher', 'lesson')