【发布时间】:2016-03-09 06:58:46
【问题描述】:
我有一些简单的模型,Profile、Certifier 和 Designer,后者继承自 Profile(多表继承)。在 Designer 中,有一个 Certifier 的外键。
class Profile(models.Model):
TYPES = (
('admin', _('Administrator')),
('certifier', _('Certifier')),
('designer', _('Designer'))
)
user = models.OneToOneField(User)
type = models.CharField(max_length=9, choices=TYPES)
def __str__(self):
return self.user.username + ' (' + self.type + ')'
class Admin(Profile):
pass
class Certifier(Profile):
pass
class Designer(Profile):
certifier = models.ForeignKey(Certifier)
在 Django 1.8 中这可以完美运行,但在 1.9 中我得到了;
django.core.management.base.SystemCheckError: SystemCheckError: 系统检查发现一些问题:
错误:
check.Designer.certifier:(models.E006)字段“certifier”与模型“check.profile”中的字段“certifier”冲突。
(在这种情况下,Profile.type 无关紧要,我只需要它来区分登录的用户配置文件类型)。
check.profile 显然没有“验证者”字段。这是一个错误还是我错过了什么?同样的事情发生在另一个项目中。
【问题讨论】:
-
您是否有冲突的迁移文件(可能是 006)?您是否共享数据库?你提到它发生在另一个项目中
-
@Sayse E006 是系统检查框架中的 error code,而不是迁移编号。
-
@Alasdair - 啊当然是,仍然认为问题是(曾经)可能是冲突迁移
-
1.8 没有迁移问题,也没有和其他程序共享数据库。重命名字段后,由 admin 和 auth 中的 1.9 升级引起的迁移也运行良好。这个问题的另一个发生是在另一个项目中,但也有一个带有外键的多表继承的情况:父模型组件,Window和Spacer都继承自Component,并且有一个从Window指向Spacer的外键,并且字段名称是 spacer。
-
这似乎是 1.9 中的糟糕设计,或者只是一个错误。我现在有一个在 1.8 下创建的功能完善的数据库,它在 1.9 中的 makemigrations 上出错。另外,related_name 似乎是解决问题的明显解决方案,但事实并非如此。
标签: django name-clash multi-table-inheritance django-1.9