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

Posted

技术标签:

【中文标题】Python/Django:添加自定义模型方法?【英文标题】:Python/Django: Adding custom model methods? 【发布时间】:2011-04-24 17:04:25 【问题描述】:

使用举例

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

【问题讨论】:

【参考方案1】:

你是怎么调用这个方法的?您已经定义了一个 instance 方法,该方法只能在类的实例上调用,而不能在类本身上调用。换句话说,一旦你有一个名为mymodelinstancemodel 实例,你就可以使用mymodelinstance.my_custom_method()

如果你想在class上调用它,你需要定义一个classmethod。你可以在你的方法中使用 @classmethod 装饰器来做到这一点。请注意,按照惯例,类方法的第一个参数是cls,而不是self。有关 classmethod 的详细信息,请参阅the Python documentation。

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于Python/Django:添加自定义模型方法?的主要内容,如果未能解决你的问题,请参考以下文章

Python Django 之 直接执行自定义SQL语句

python Django自定义用户模型

python Django教程 之 模型(数据库)自定义Field数据表更改QuerySet API

python Django:向管理员更改列表视图添加自定义按钮

python Django:autocomplete-light添加自定义属性以选择和预填充其他字段

python/django models中自定义用户认证及django admin自定义