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

19 投票
2 回答
21862 浏览
提问于 2025-04-16 05:24

比如说,使用下面的代码:

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

你是怎么调用这个方法的?你定义了一个实例方法,这种方法只能在类的实例上调用,而不能直接在类上调用。换句话说,一旦你有了一个叫mymodelinstancemodel实例,你就可以用mymodelinstance.my_custom_method()来调用这个方法。

如果你想在上调用这个方法,你需要定义一个类方法。你可以在方法前加上@classmethod这个装饰器来做到这一点。需要注意的是,按照惯例,类方法的第一个参数是cls,而不是self。想了解更多关于类方法的内容,可以查看Python文档

不过,如果你实际上想做的是添加一个可以进行查询集操作的方法,比如objects.filter()或者objects.get(),那么最好的办法是定义一个自定义的管理器,并在里面添加你的方法。这样你就可以用model.objects.my_custom_method()来调用了。再次建议查看Django文档,了解管理器的相关信息。

撰写回答