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



我有一些简单的模型,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"中的字段"certificer"冲突。

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

check.profile显然没有"certifier"字段。这是bug还是我错过了什么?同样的事情也发生在另一个项目中。

我认为不应该对外键关系使用名称证明器,因为根据文档,类Profile实际上有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) 的内容

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

或者,您也可以通过在settings中添加SILENCED_SYSTEM_CHECKS = ['models.E006']来使检查静音,但这不是一个好方法。

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

class Meta:
    abstract = True

相关内容

  • 没有找到相关文章

最新更新