加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Django admin – 编辑页面上的错误模型对象

发布时间:2020-12-20 13:32:11 所属栏目:Python 来源:网络整理
导读:我有3个继承的类(Fitters – Workers – Staffs)与我的数据库中的表连接(类名为复数,但现在不重要). 用户只能添加/编辑/删除Fitters.工人和员工表自动更新(级联). 它工作正常:当我添加新的Fitter时,所有更改都会到达数据库中的所有表.但是当我想通过Django
我有3个继承的类(Fitters – > Workers – > Staffs)与我的数据库中的表连接(类名为复数,但现在不重要).

用户只能添加/编辑/删除Fitters.工人和员工表自动更新(级联).

它工作正常:当我添加新的Fitter时,所有更改都会到达数据库中的所有表.但是当我想通过Django管理工具编辑任何Fitter时,我会去编辑Fitter页面,我看到填充字段不正确.

例如:

>在Staffs表中,我有“John Smith”,id = 41
>在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)

    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)

    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'

感谢所有帮助过我的人.

解决方法

这看起来有些奇怪.但是,据我所知,当使用 multi-table inheritance时,Django会自动设置父母和子女之间所需的一对一映射.正如你手动设置的那样,很可能会引入某种不一致性因此.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读