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