我有 3 个继承的类(Fitters -> Workers -> Staffs)与我的数据库中的表相连(类名是复数,但现在这不重要)。

用户只能添加/编辑/删除 Fitter。 Workers 和 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”填写(员工表中的 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)
    ...
    

    解决方案:

    解决方案是我不需要为每个模型使用我自己的 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'
    

    感谢所有帮助过我的人。

    最佳答案

    这看起来确实有些奇怪。但是,据我所知,Django 会在使用 multi-table inheritance 时自动设置父子之间所需的一对一映射。由于您也手动设置了这些,因此很可能会引入某种不一致。

    如果直接在数据库中查看,两个不同的一对一关系是否一致?

    如果从模型中删除显式的一对一字段会发生什么?

    关于python - Django admin - 编辑页面上的模型对象错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13949244/

    10-09 17:17