我正在开发一个项目,我需要定义一些模型,这些模型中包含一些带有业务逻辑的函数,例如,如何在从db获取数据时处理数据。
我想从同一个父模型继承多个模型,在每个模型中我覆盖一些特定的函数。我不希望为每个新模型创建一个新表,因为我只是覆盖功能而不添加任何字段。怎么做到这一点?
代理模型没有帮助,因为我无法从数据库对象中检索适当的类。
实施例: -
class ParentModel(models.Model):
f1=fields.IntegerField()
def processing_func1(self):
<default func1 functionality>
def processing_func2(self):
<default func2 functionality>
class ChildModel1(models.Model):
def processing_func1(self):
<overridden func1 functionality>
class ChildModel2(models.Model):
def processing_func2(self):
<overridden func2 functionality>
我需要通过ParentModel访问子模型。例如,如果我做ParentModel.objects.all()我得到ChildModels的对象。对于正常模型继承,我使用django-model-utils实现了这一点。
答案 0 :(得分:0)
你需要的是这里的Mixin,并使抽象类继承django模型的属性
像这样的东西。
class UtilMixin(models.Model):
def processing_func1(self):
<default func1 functionality>
def processing_func2(self):
<default func2 functionality>
class Meta:
abstract = True
class ChildModel1(UtilMixin):
def processing_func1(self):
<overridden func1 functionality>
class ChildModel2(UtilMixin):
def processing_func2(self):
<overridden func2 functionality>
答案 1 :(得分:0)
您可以通过使用 Proxy models 来实现这一点。如文档中所述:
<块引用>使用多表继承时,会新建一个数据库表 对于模型的每个子类。这通常是期望的行为, 因为子类需要一个地方来存储任何额外的数据字段 基类中不存在的。然而,有时,你只 想要改变模型的 Python 行为——也许是为了改变 默认管理器,或添加新方法。
因此您可以通过为原始模型创建一个代理来添加或覆盖函数。
以下是如何创建代理模型的示例:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class MyPerson(Person):
class Meta:
proxy = True
def do_something(self):
# ...
pass
MyPerson
类与其父类 Person
对同一个数据库表进行操作。特别是,Person
的任何新实例也可以通过 MyPerson
访问。