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

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:(model s.E006)字段"certifier"与模型"check.profile"中的字段"certifier"冲突.

(在本例中,Profile.type是无关紧要的,我只需要它来区分登录的用户配置文件类型).

判断配置文件显然没有字段"certifier".这是虫子还是我错过了什么?同样的事情也发生在另一个项目中.

推荐答案

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

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)左右吧

正如在 comments 中指出的,您可以将模型重命名为CertifierProfile、AdminProfile等,以避免冲突.

或者你也可以在settings的基础上加SILENCED_SYSTEM_CHECKS = ['models.E006'],但这不是一个好方法.

Django相关问答推荐

Django BooleanField如何使用RadioSelect?

""关系"core_Boundary_summary的列user_id中的空值"违反了非空约束|失败行包含(2,title,string,null)

Django allauth 社交帐户注册中邮箱的模板变量

从多个数据库访问 Django 会话

组织大型 Django 元素的指南

Django REST Framework 图片上传

使用 Python/Django 上传大文件

关于Django中批量保存对象的问题

Django ORM 和锁定表

如何缓存 Django Rest Framework API 调用?

在 Django 过滤器语句中,__exact 和等号 (=) 有什么区别?

如何迭代模板中 SelectField 的选项?

Ruby on Rails 会影响网页的外观吗?

Django BigInteger自动增量字段作为主键?

如何使用 django 发送 POST 请求?

Django unique=True 不工作

在 Django 中测试different layers的最佳实践是什么?

运行单元测试时禁用 Django South?

BASE DIR 的绝对路径是什么?

Django:必须使用对象 pk 或 slug 调用通用详细视图