Django 1.9:父模型中的字段与不存在字段的字段冲突

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我有一些简单的模型,配置文件,认证者和设计者,后两个继承自配置文件(多表继承)。在设计师里有一个外键给认证者。

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我得到;

SystemCheckError:SystemCheckError:SystemCheckError:系统检查确定了一些问题: 错误: 验证者:(Models.E 006)字段‘验证者’与模型‘check.profile’中的字段‘验证者’发生冲突。

(Profile.type在这种情况下无关紧要,我只需要它来区分登录的用户配置文件类型)。

配置文件显然没有字段“验证者”。这是个窃听器还是我错过了什么?在另一个项目中也会发生同样的事情。

提问于
用户回答回答于

我认为你不应该使用外键关系的名称验证器,因为类配置文件实际上有验证器、管理员和设计器字段(尽管是描述符)。在这种情况下,名字实际上会发生冲突。

from django.contrib.auth.models import User

c = Certifier.objects.create(
    type='admin',
    user=User.objects.latest('date_joined'),
)

p = c.profile_ptr
print(p.certifier) #username (admin)

变成类似的东西certifier_field = models.ForeignKey(Certifier)

正如注释中指出的,可以将模型重命名为CertifierProfile、AdminProfile等,以避免冲突。

或者你也可以通过添加沉默_系统_支票=“模型,E 006”但这不是一个好方法。

用户回答回答于

可以指定Profile抽象类。这将防止检查与父字段混淆。

class Meta:
    abstract = True

扫码关注云+社区