首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Django 1.9:字段与父模型中不存在的字段的字段冲突

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

Stack Overflow用户
提问于 2015-12-04 18:56:23
回答 2查看 14K关注 0票数 33

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

代码语言:javascript
复制
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显然没有“认证器”字段。这是一个bug,还是我漏掉了什么?同样的事情也发生在另一个项目中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-04 19:42:30

我认为你不应该使用外键关系的名称认证符,因为根据docs,类配置文件实际上有certifieradmindesigner字段(尽管是通过描述符),在这种情况下,名称实际上会发生冲突。

代码语言:javascript
复制
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等,以避免冲突。

或者,您也可以通过将SILENCED_SYSTEM_CHECKS = ['models.E006']添加到您的settingssilence the check,但这不是一个好方法。

票数 27
EN

Stack Overflow用户

发布于 2016-08-08 23:09:05

您可以指定Profileabstract class。这将防止检查与您的父字段混淆。

代码语言:javascript
复制
class Meta:
    abstract = True
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34086729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档