2011-09-19 3 views
1

하나의 필드에 다 대다 (Many-To-Many) 유형이 있어야하는 DB가 있지만 그렇지 않으며 변경할 수 없습니다.Django. 양식에 대한 다 대다 필드 (모델에는 포함되지 않음)

예를 들어 학생 목록과 과목 목록이 있습니다. 제목은 학생 테이블의 다 대다 필드 여야하지만 내가 말했듯이 그렇지 않습니다. 학생 표에는이 입력란이 전혀 없습니다. 그러나 subject_id-student_id 항목이 포함 된 과목들도 있습니다.

DB에 학생을 저장할 때 학생 과목 데이터를 변경할 수있는 일종의 제목 필드를 학생 양식에 포함하려면 어떻게해야합니까? 문제는 DB 구조를 변경할 수 없기 때문에 장고의 도움으로 만 만들 필요가 있다는 것입니다.

답변

1

외래 키를 알고있는 것처럼 데이터베이스 테이블에는 '다 대다 필드'와 같은 것이 없습니다. 데이터베이스 표현에서 다 대 다 관계는 관계에 설정할 레코드의 기본 키 (일반적으로 ID)를 연결하는 추가 테이블을 사용하여 실현됩니다. 귀하의 경우에는 그것이 테이블 학생 - 과목입니다. Django는 모델에서 다 대다 관계를 정의 할 때이 테이블을 사용합니다. 데이터베이스 구조를 전혀 변경할 필요가 없으며 이제는 완벽하게 작동합니다.

은 설명서를 참조하십시오 : ManyToManyField

당신은 당신의 중간 테이블 (즉 학생 - 주제)의 이름으로 db_table 옵션을 설정해야합니다. 그러면 모든 것이 잘 작동합니다.

EDIT :
귀하의 의견을 고려할 때 장고는 테이블에서 제공하지 않는 특정 명명 규칙 (즉, MODELNAME_id)을 기대합니다. 테이블 자체를 변경할 수 없다고 말하면서 다른 것을 시도해야합니다.
중개 테이블 (students-subjects)에 대한 추가 모델을 만들고 'students'필드를 students 모델의 외래 키로 지정하고 'subjects'필드를 피험자 모델의 외래 키로 정의해야합니다. 그런 다음 many-to-many 필드의 경우 중개 테이블의 이름과 함께 'through'옵션을 지정합니다. 'db_column'옵션을 설정하여 Django가 databse 열에 어떤 이름을 사용할 지 알려줍니다. 데이터베이스 테이블 이름을 지정하려면 메타 클래스의 'db_table'이 필요합니다. 나는 그 당신을 도움이되기를 바랍니다

class StudentsSubjects(models.Model): 
    student = models.ForeignKey(Student, db_column='student') 
    subject = models.ForeignKey(Subject, db_column='subject') 

    class Meta: 
     db_table = 'students-subjects'  

class Student(models.Model): 
    ... 
    subjects = models.ManyToManyField(Subject, through='StudentsSubjects') 
    ... 

class Subject(models.Model): 
    ... 

:

당신은 뭔가를 얻을.
자세한 내용은 Extra fields on many-to-many relationship을 참조하십시오.

+0

나는 그것을했고 SQL 오류가 발생했습니다. 열 이름 'subject_id'가 잘못되었습니다. 중간 테이블에는 'subject_id'필드가 없습니다. 중간 표에는 'subject'필드와 'student'필드가 있습니다. 장고에 '_id'접미사를 추가하려고합니다. 제목 테이블에는 subject_id가 아닌 id 필드가 있습니다. 내가 놓친 게 무엇입니까? – sunprophit

+0

나는 그면을 언급하면서 나의 대답을 편집했다. – j0ker

+0

예, 고마워요. 나는이 기사를 보았다. 그러나 'through'매개 변수를 사용하면 StudentAdmin 양식에 필드 'subjects'필드를 포함 할 수 없습니다. 'subjects'는 'through'모델을 수동으로 지정하기 때문에 ManyToManyField 필드 'subjects'를 포함 할 수 없습니다. – sunprophit