我有3个继承的类(Fitters - > Workers - > Staffs)与我的数据库中的表连接(类名为复数,但现在不重要了。)
用户只能添加/编辑/删除Fitters。工人和员工表自动更新(级联)。
它工作正常:当我添加新的Fitter时,所有更改都会到达数据库中的所有表。但是当我想通过Django管理工具编辑任何Fitter时,我会去编辑Fitter页面,我看到填充的字段不正确。
例如:
当我去编辑Fitter" John Smith"页面,我看到所有字段由" Kevin Thomas" (员工表中的id = 21!)。 所以,Django错过了Workers表并直接进入Staffs表。
我该如何解决?
这是我的草稿代码:
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:
我试图改变我的代码:
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文件的一部分:
from django.contrib import admin
from appclient.models import *
admin.site.register(Fitters)
admin.site.register(Staffs)
admin.site.register(Workers)
...
SOLUTION:
解决方案是我不需要为每个模型使用我自己的id和ForeignKey。 Djando自动为每个模型创建特殊字段,并将其用作id(PrimaryKey)和链接到父表(ForeignKey)。
这是解决方案:
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'
感谢所有帮助过我的人。
答案 0 :(得分:1)
这看起来有些奇怪。但是,据我所知,当使用multi-table inheritance时,Django将自动设置父母与子女之间所需的一对一映射。由于您还手动设置了这些,因此可能会出现某种不一致性。
如果直接查看数据库,两个不同的一对一关系是否一致?
如果从模型中删除明确的一对一字段会怎样?