我有一些简单的模型,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显然没有字段'certifier'.这是一个错误还是我错过了什么?同样的事情发生在另一个项目中.
我认为你不应该为那个外键关系使用name certifier,因为类Profile实际上有certifier
,admin
而且designer
根据docs的字段(尽管是描述符),在这种情况下名字实际上会发生冲突.
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']
settings
您可以指定Profile
是一个抽象类.这将阻止检查与您的父字段混淆.
class Meta: abstract = True