如何继承django模型只是为了覆盖函数?

时间:2017-02-15 08:37:59

标签: django django-models

我正在开发一个项目,我需要定义一些模型,这些模型中包含一些带有业务逻辑的函数,例如,如何在从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实现了这一点。

2 个答案:

答案 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 访问。