django:管理中的模型继承和验证程序
我有一个由两个孩子继承的抽象模型。在子类中,一个是设置验证器。当我运行代码时,我看到两个孩子都有验证器 以下是伪代码:django:管理中的模型继承和验证程序,django,Django,我有一个由两个孩子继承的抽象模型。在子类中,一个是设置验证器。当我运行代码时,我看到两个孩子都有验证器 以下是伪代码: class myAbstract(models.Model): Intro = models.TextField(blank=True, null=True, ) class Meta: abstract = True class child1(myAbstract): class Meta: ver
class myAbstract(models.Model):
Intro = models.TextField(blank=True, null=True, )
class Meta:
abstract = True
class child1(myAbstract):
class Meta:
verbose_name = 'child 1'
class child2(myAbstract):
def __init__(self, *args, **kwargs):
super(child2, self).__init__(*args, **kwargs)
intro = self._meta.get_field('Intro')
intro.validators.append(MaxLengthValidator(60))
class Meta:
verbose_name = 'child 2'
在管理中,如果我添加一个child1,然后添加一个child2,那么验证器将对child2生效并限制字符数。如果我从child2开始,那么child2不会得到验证器
这是预期的行为吗?如果有,建议的编码方式是什么?我想把介绍移到儿童课上
已解决:
正如Alasdair指出的,验证器是一个类变量,因此这是预期的行为
我试着将介绍字段移到孩子身上,但没有成功。我使用了这个解决方案:这在模型表单中设置了forms.CharField。我真的没有想到会出现这种行为,但是在模型的背景中有很多神奇的事情发生。我看到两种解决方案:
不是每个模型实例都设置
验证器。当您附加MaxLengthValidator
时,您正在更改父类的intro
字段
我不认为有一个简单的方法来解决这个问题。您可以为每个子模型编写一个clean()
方法,并在那里执行验证。但是,我认为将intro
字段移动到子类中可能是最好的选择。在模型表单中设置验证器是一个好主意。但是第一个建议不起作用,因为self.intro
是字段的值,因此没有validators
属性。