Django admin - Wrong model object at edit page
我有3个继承的类(Fitters-> Workers-> Staffs),这些类与数据库中的表相关联(类名以复数形式,但是现在不重要了)。
用户只能添加/编辑/删除钳工。 Workers and Staffs表会自动更新(级联)。
它工作正常:当我添加新的Fitter时,所有更改都出现在数据库中的所有表上。但是当我想通过Django管理工具编辑任何Fitter时,我去编辑Fitter页面,我看到错误填写的字段。
例如:
- 在Staffs表中,我有id = 41的" John Smith"
- 在Workers表中,我有id = 21和ForeignKey = 41的记录(给John Smith)
- 在Fitters表中,我有id = 5和ForeignKey = 21的记录(记录在Workers表中)
当我去编辑Fitter" John Smith"页面时,我看到" Kevin Thomas"(在Staffs表中的id = 21)填充的所有字段。
因此,Django错过了Workers表,而直接进入Staffs表。
我该如何解决?
这是我的草稿代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | class Staffs(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=135, blank=True) surname = models.CharField(max_length=135, blank=True) def __unicode__(self): return self.name +"" + self.surname class Meta: db_table = u'staffs' class Workers(Staffs): idWorker = models.AutoField(primary_key=True, db_column='id') staffs_idstaff = models.OneToOneField('Staffs', db_column='Staffs_idstaff', parent_link=True) brigades_idbrigade = models.ForeignKey('Brigades', db_column='Brigades_idBrigade') def __unicode__(self): return self.staffs_idstaff.name +"" + self.staffs_idstaff.surname class Meta: db_table = u'workers' class Fitters(Workers): idFitter = models.AutoField(primary_key=True, db_column='id') qualification = models.CharField(max_length=135, blank=True) workers_idworker = models.OneToOneField('Workers', db_column='Workers_idWorker', parent_link=True) def __unicode__(self): staff = self.workers_idworker.staffs_idstaff return staff.name +"" + staff.surname class Meta: db_table = u'fitters' |
EDIT1:
我试图这样更改代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class Staffs(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=135, blank=True) surname = models.CharField(max_length=135, blank=True) class Meta: db_table = u'staffs' class Workers(Staffs): idWorker = models.AutoField(primary_key=True) brigades_idbrigade = models.ForeignKey('Brigades') class Meta: db_table = u'workers' class Fitters(Workers): idFitter = models.AutoField(primary_key=True) qualification = models.CharField(max_length=135, blank=True) class Meta: db_table = u'fitters' |
这很简单。我同步了数据库,但问题完全相同!
EDIT2:
我的admin.py文件的一部分:
1 2 3 4 5 6 7 | from django.contrib import admin from appclient.models import * admin.site.register(Fitters) admin.site.register(Staffs) admin.site.register(Workers) ... |
解决方案:
解决方案是我不需要为每个模型使用自己的ID和ForeignKey。 Djando自动为每个模型创建特殊字段,并将其用作ID(PrimaryKey)和用于链接到父表(ForeignKey)的字段。
这是解决方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Staffs(models.Model): name = models.CharField(max_length=135, blank=True) surname = models.CharField(max_length=135, blank=True) class Meta: db_table = u'staffs' class Workers(Staffs): brigades_idbrigade = models.ForeignKey('Brigades') class Meta: db_table = u'workers' class Fitters(Workers): qualification = models.CharField(max_length=135, blank=True) class Meta: db_table = u'fitters' |
感谢所有帮助过我的人。
这似乎有些奇怪。但是,据我了解,当使用多表继承时,Django会自动在父子之间设置所需的一对一映射。由于您还手动设置了这些设置,因此很可能是由于某种原因引入了某种不一致。
如果直接在数据库中查看,两个不同的一对一关系是否一致?
如果从模型中删除显式的一对一字段会发生什么?