我想在创建特定django模型的实例时进行额外的初始化。我知道 重写__init__会导致麻烦。我还应该考虑其他什么选择?
更新。额外细节: 目的是初始化该模型的实例所代表的状态机。这个状态机由一个导入的库提供,它的内部状态由我的django-model保存。我们的想法是,无论何时加载模型,状态机都将使用模型的数据自动初始化。
我想在创建特定django模型的实例时进行额外的初始化。我知道 重写__init__会导致麻烦。我还应该考虑其他什么选择?
更新。额外细节: 目的是初始化该模型的实例所代表的状态机。这个状态机由一个导入的库提供,它的内部状态由我的django-model保存。我们的想法是,无论何时加载模型,状态机都将使用模型的数据自动初始化。
重写 __init__
可能会工作,但这是个坏主意,而不是Django的方式。
在Django中使用它的正确方法是使用 信号。
在这种情况下你感兴趣的是 pre_init
和 post_init
。
django.db.models.signals.pre_init
每当你实例化Django时 模型,此信号在模型的开头发送
__init__()
方法。
django.db.models.signals.post_init
喜欢
pre_init
,但是这个是发送的 当。。。的时候__init__()
:方法完成
所以你的代码应该是这样的
from django.db import models
from django.db.models.signals import post_init
class MyModel(models.Model):
# normal model definition...
def extraInitForMyModel(**kwargs):
instance = kwargs.get('instance')
do_whatever_you_need_with(instance)
post_init.connect(extraInitForMyModel, MyModel)
您也可以将信号连接到Django的预定义模型。