Python / Django:添加自定义模型方法?

时间:2010-10-13 07:37:07

标签: python django methods model

使用例如

class model(models.Model)
    ....
    def my_custom_method(self, *args, **kwargs):
        #do something

当我尝试在pre_save,save,post_save等过程中调用此方法时,Python引发了一个TypeError;未绑定的方法。

如何添加自定义模型方法,这些方法可以像model.objects.get()等一样执行?

编辑:尝试使用super(model, self).my_custom_method(*args, **kwargs),但在这种情况下,Python说该模型没有属性my_custom_method

2 个答案:

答案 0 :(得分:29)

你怎么称呼这种方法?您已经定义了一个实例方法,该方法只能在类的实例上调用,而不能在类本身上调用。换句话说,如果您的model实例名为mymodelinstance,则可以执行mymodelinstance.my_custom_method()

如果要在上调用它,则需要定义一个classmethod。您可以使用方法中的@classmethod装饰器执行此操作。请注意,按照惯例,classmethod的第一个参数是cls,而不是self。有关classmethod的详细信息,请参阅the Python documentation

但是,如果您真正想要做的是添加一个执行查询集级操作的方法,例如objects.filter()objects.get(),那么最好的办法是定义一个自定义管理器并添加你的方法在那里。然后你就可以model.objects.my_custom_method()了。再次,请参阅管理员上的Django documentation

答案 1 :(得分:0)

如果要为模型实现Signal,则不一定只需要在模型类中定义。您可以在类外部定义它,并将类名作为参数传递给connect函数。

但是,在您的情况下,您需要模型对象来访问该方法。