我有一个数据库,它应该有一个多对多类型的字段,但它不是,我也不能改变这一点。
例如,我有一个学生列表和一个主题列表。Subject应该是学生表中的多对多字段,但正如我所说的,它不是。学生表中根本没有这个字段。但是还有另一个表students-subjects,它包含了subject_id-student_id项。
当我在DB中保存一个学生时,我如何在学生表单中嵌入一些可以改变学生-科目数据的主题字段?问题是我不能改变DB的结构,所以只需要借助Django就可以了。
发布于 2011-09-19 16:51:04
对于数据库表,不存在“多对多字段”这样的东西,就像你可能知道的外键一样。在数据库表示中,多对多关系是通过使用额外的表来实现的,该表链接了您想要在关系中设置的记录的主键(通常是In )。在您的情况下,这是表学生-主题。当您在模型中定义多对多关系时,Django使用此表。你根本不需要改变你的数据库结构,它会像现在一样完美地工作。
请参阅文档:ManyToManyField
您必须使用中间表的名称(即db_table -subjects)来设置学生选项。那么一切都应该工作得很好。
编辑:
考虑到您的评论,问题是Django期望特定的命名约定(即MODELNAME_id),而您的表并没有提供这种约定。既然您说您不能更改表本身,那么您必须尝试其他方法。
您必须为您的中介表( students - subjects )创建一个额外的model,并将字段'students‘定义为学生模型的外键,将字段'subjects’定义为主题模型的外键。然后,对于多对多字段,使用中间表的名称指定选项“通过”。设置选项'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):
...
我希望这会对你有所帮助。
有关更多细节,请参阅:Extra fields on many-to-many relationship。
https://stackoverflow.com/questions/7473509
复制相似问题