Django 1.9:字段与父模型中不存在字段的字段冲突
Django 1.9: Field clashes with the field of non-existing field in parent model
我有一些简单的模型,Profile、Certifier 和 Designer,后两者继承自 Profile(多 table 继承)。在 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: System check identified some issues:
ERRORS:
check.Designer.certifier: (models.E006) The field 'certifier' clashes with the field 'certifier' from model 'check.profile'.
(Profile.type在这种情况下无关紧要,我只需要它来区分登录用户配置文件类型)。
check.profile显然没有字段'certifier'。这是一个错误还是我错过了什么?同样的事情发生在另一个项目中。
我认为您不应该为该外键关系使用名称证明者,因为 class 配置文件实际上有 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 等以避免冲突。
或者您也可以 silence the check 通过将 SILENCED_SYSTEM_CHECKS = ['models.E006']
添加到您的 settings
,但这不是一个好的方法。
您可以指定 Profile
是一个 abstract class。这将阻止支票与您的父字段混淆。
class Meta:
abstract = True
我有一些简单的模型,Profile、Certifier 和 Designer,后两者继承自 Profile(多 table 继承)。在 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: System check identified some issues:
ERRORS:
check.Designer.certifier: (models.E006) The field 'certifier' clashes with the field 'certifier' from model 'check.profile'.
(Profile.type在这种情况下无关紧要,我只需要它来区分登录用户配置文件类型)。
check.profile显然没有字段'certifier'。这是一个错误还是我错过了什么?同样的事情发生在另一个项目中。
我认为您不应该为该外键关系使用名称证明者,因为 class 配置文件实际上有 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 等以避免冲突。
或者您也可以 silence the check 通过将 SILENCED_SYSTEM_CHECKS = ['models.E006']
添加到您的 settings
,但这不是一个好的方法。
您可以指定 Profile
是一个 abstract class。这将阻止支票与您的父字段混淆。
class Meta:
abstract = True