Джанго.Поле «многие ко многим» для формы, но не для модели - PullRequest
1 голос
/ 19 сентября 2011

У меня есть база данных, в которой должно быть одно поле с типом «многие ко многим», но это не так, и я не могу это изменить.

Например, у меня есть список студентов и список предметов,Предмет должен быть полем «многие ко многим» в таблице учеников, но, как я уже сказал, это не так.Стол студентов не имеет этого поля вообще.Но есть еще одна таблица студентов-предметов, которая содержит объекты subject_id-student_id.

Как я могу встроить в форму студента какое-то поле предмета, которое может изменить данные студентов-предметов при сохранении студента в БД?Проблема в том, что я не могу изменить структуру БД, поэтому делать это нужно только с помощью Django.

1 Ответ

1 голос
/ 19 сентября 2011

Не существует такого понятия, как «поле« многие ко многим »» для таблицы базы данных, о которой вы, возможно, знаете из внешних ключей.В представлении базы данных отношения «многие ко многим» реализуются с помощью дополнительной таблицы, которая связывает первичные ключи (обычно идентификаторы) записей, которые вы хотите установить в отношении.В вашем случае это таблица студентов-предметов.Django использует эту таблицу, когда вы определяете отношение «многие ко многим» в модели.Вам вообще не нужно менять структуру вашей базы данных, она будет отлично работать, как сейчас.

См. Документацию: ManyToManyField

Вам придетсяустановите опцию db_table с именем вашей таблицы-посредника (т.е. студентов-предметов).Тогда все должно работать нормально.

РЕДАКТИРОВАТЬ:
Учитывая ваш комментарий, проблема в том, что Django ожидает определенное соглашение об именах (например, MODELNAME_id), которое не предусмотрено вашей таблицей.Поскольку вы говорите, что не можете изменить саму таблицу, вам нужно попробовать что-то еще.
Вы должны создать дополнительную модель для своей таблицы-посредника (студенты-предметы) и определить поле «студенты» как внешний ключ кмодель студентов и поле «предметы» как внешний ключ к модели предметов.Затем для поля «многие ко многим» вы указываете опцию «через» с именем вашей промежуточной таблицы.Установите параметры db_column, чтобы Django знал, какие имена вы хотите использовать для столбцов базы данных.'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):
    ...

Надеюсь, это поможет вам.
Подробнее см.: Дополнительные поля в отношении многие ко многим .

...