Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django抽象模型继承-使所有字段都可以为空_Django_Python 3.x_Django Models - Fatal编程技术网

Django抽象模型继承-使所有字段都可以为空

Django抽象模型继承-使所有字段都可以为空,django,python-3.x,django-models,Django,Python 3.x,Django Models,我有一个AbstractModel,Model和DraftModel 我需要DraftModel从AbstractModel继承,但是所有inherited字段都应该是null=True。我不能将Model字段更改为null=True,因为有太多的逻辑建立在这个基础上 我不希望手动覆盖所有字段 我试过: def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) for field in self

我有一个
AbstractModel
Model
DraftModel

我需要
DraftModel
AbstractModel
继承,但是所有
inherited
字段都应该是
null=True
。我不能将
Model
字段更改为
null=True
,因为有太多的逻辑建立在这个基础上

我不希望手动覆盖所有字段

我试过:

    def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)
    for field in self._meta.fields:
        field.null = True
这不管用,你知道吗

编辑


我想出了一个解决方案(检查我的答案),但您可以添加您的解决方案。

更改
\uuuu init\uuuuu
中的字段无效,因为没有呼叫

DrafModel
下添加此代码段可以:

for field in DraftModel._meta.fields:
    field.null = True
当然,您应该排除像
PrimaryKey
BooleanField

编辑

就我而言,这是可行的:

for field in DraftModel._meta.fields:
     if not field.primary_key and not isinstance(field, models.BooleanField):
          field.null = True

您可以覆盖
\uuuu调用\uuuu
方法:

class DraftModel(SomeAbstractModel):

    def __call__(self, *args, **kwargs):
        for f in self.__class__._meta.fields:
            if f.name not in ['id'] and not isinstance(f, models.BooleanField):  # copy pasted from your answer
                f.null = True
        super(DraftModel, self).__call__(*args, **kwargs)