Python/Django:如何添加自定义模型方法?
比如说,使用下面的代码:
class model(models.Model)
....
def my_custom_method(self, *args, **kwargs):
#do something
当我在 pre_save、save、post_save 等方法中调用这个方法时,Python 报错了,提示是类型错误;未绑定的方法。
怎么才能添加自定义的模型方法,让它们可以像 model.objects.get() 这样被执行呢?
补充:我试过用 super(model, self).my_custom_method(*args, **kwargs)
,但在这种情况下,Python 说模型没有这个 my_custom_method
属性。
2 个回答
0
如果你要为你的模型实现一个信号,这个信号不一定非得在模型类里面定义。你可以把它放在类外面,然后在连接函数中把类名作为参数传进去。
不过在你的情况下,你需要模型对象来访问这个方法。
45
你是怎么调用这个方法的?你定义了一个实例方法,这种方法只能在类的实例上调用,而不能直接在类上调用。换句话说,一旦你有了一个叫mymodelinstance
的model
实例,你就可以用mymodelinstance.my_custom_method()
来调用这个方法。
如果你想在类上调用这个方法,你需要定义一个类方法。你可以在方法前加上@classmethod
这个装饰器来做到这一点。需要注意的是,按照惯例,类方法的第一个参数是cls
,而不是self
。想了解更多关于类方法的内容,可以查看Python文档。
不过,如果你实际上想做的是添加一个可以进行查询集操作的方法,比如objects.filter()
或者objects.get()
,那么最好的办法是定义一个自定义的管理器,并在里面添加你的方法。这样你就可以用model.objects.my_custom_method()
来调用了。再次建议查看Django文档,了解管理器的相关信息。