如何从其他模块向Django类添加新方法?

时间:2015-02-18 18:49:51

标签: python django

我有一个Django模型说:

class MyOperation(models.Model):
    name = models.CharField(max_length=100)

    def my_method(self):
        pass

我希望能够从不同的Django应用程序中为这个类添加一个新方法。

我尝试从另一个名为custom.py的应用模块执行此操作:

from operations.models import MyOperation

def op_custom(test):
    print "testing custom methods"

MyOperation.op_custom = op_custom

然而,这似乎不起作用,在运行时该方法不存在。

这是从不同的django应用程序修改类定义的方法吗?有没有更好的方法呢?

由于

1 个答案:

答案 0 :(得分:4)

The Right Way™是通过mixin来实现的:

class MyMixIn(object):
    def op_custom(self):
        print("foo")

class MyOperation(models.Model, MyMixIn):
    def op_normal(self):
        print("bar")

与其他方法中的猴子修补相比,这有几个优点:

  • mixin属于班级' method resolution order,所以内省效果很好。
  • 保证在类的每个实例上定义,无论它在何处实例化,因为类本身都是从mixin继承的。否则,您可能会在应用猴子补丁之前结束实例,此方法不适用。
  • 它提供了一个明显的地方,可以在将来添加这些方法。