Python Django-如何使实现字段成为必需字段?

Python Django-如何使实现字段成为必需字段?,python,django,django-models,Python,Django,Django Models,我正在为大约10个模型建立一些抽象模型。我需要以某种方式使1字段不是在抽象模型中声明的,而是必须在继承模型中声明的。 怎么做?是否有任何方法可以使用未实现错误?如果可能的话,如果不深入Django,恐怕没有一种简单的方法可以实现这一点 主要原因是在Django。这意味着,如果您想要在作为实例的基本抽象类中声明抽象属性,那么您将无法在子类中重写它,这与正常的Python类继承范式相反。引用文件: 在普通Python类继承中,允许子类重写父类中的任何属性。在Django中,作为字段实例的属性不允许这

我正在为大约10个模型建立一些抽象模型。我需要以某种方式使1字段不是在抽象模型中声明的,而是必须在继承模型中声明的。
怎么做?是否有任何方法可以使用
未实现错误

如果可能的话,如果不深入Django,恐怕没有一种简单的方法可以实现这一点

主要原因是在Django。这意味着,如果您想要在作为实例的基本抽象类中声明抽象属性,那么您将无法在子类中重写它,这与正常的Python类继承范式相反。引用文件:

在普通Python类继承中,允许子类重写父类中的任何属性。在Django中,作为字段实例的属性不允许这样做(至少目前不允许)。如果基类有一个名为author的字段,则不能在从该基类继承的任何类中创建另一个名为author的模型字段

重写父模型中的字段会在初始化新实例(指定在模型中初始化哪个字段。init)和序列化等方面带来困难。这些是普通Python类继承不必以完全相同的方式处理的特性,因此Django模型继承和Python类继承之间的区别不是任意的

此限制仅适用于作为字段实例的属性。如果愿意,可以覆盖普通Python属性。它还仅适用于Python所看到的属性名称:如果手动指定数据库列名,则可以在多表继承的子模型和祖先模型中显示相同的列名(它们是两个不同数据库表中的列)

如果覆盖任何祖先模型中的任何模型字段,Django将引发FieldError

但是,如果属性不是
字段
实例(虽然可能性很小),则可以使用decorator实现您想要的结果。像这样的方法应该会奏效:

class Person(models.Model):
    def __init__(self, *args, **kwargs):
        super(Person, self).__init__(*args, **kwargs)
        self.last_name

    first_name = models.CharField(max_length=30)

    @property
    def last_name(self):
        raise NotImplementedError

    class Meta:
        abstract = True

class Student(Person):
    home_group = models.CharField(max_length=5)
    last_name = "Doe"  # "models.CharField()" will not work!

class BadStudent(Person):
    home_group = models.CharField(max_length=5)
    # "NotImplmentedError" will be raised when instantiating BadStudent()

您可能还想看看。不过,我不确定它将如何与Django的模型继承配合使用。

为什么要这样做??在AbstractModel中不能声明公共字段的原因是什么

如果您真的想这样做,请使用以下说明:

我想为注释创建一个抽象类。我希望每个模型都对自己的模型有自己的评论。这就是为什么我想创建一个抽象类,并要求在每个子模型中创建ForeignKey字段。