Python 当模型字段’;s值变化

Python 当模型字段’;s值变化,python,django,django-models,Python,Django,Django Models,我有以下型号: class EditableField(models.Model): template = models.ForeignKey(FieldTemplate) value = models.CharField(max_length=255) state = FSMField(default='new', protected=True) 使用我有以下状态机: [*] --> new new --> edited new --> appro

我有以下型号:

class EditableField(models.Model):
    template = models.ForeignKey(FieldTemplate)
    value = models.CharField(max_length=255)
    state = FSMField(default='new', protected=True)
使用我有以下状态机:

[*] --> new

new --> edited
new --> approved

edited --> approved
edited --> rejected

rejected --> edited

approved --> closed

closed --> [*]
(您可以使用将其可视化)

如果您不知道FSM,每个转换都是通过调用带注释的模型方法完成的,如下所示:

@transition(field='state',
            source=['new', 'edited'],
            target='approved')
def approve(self):
    # I can make some side effects here, or just pass, the transition will
    # be done either way, unless an exception is raised
    pass
现在,我只需设置模型的
字段,即可进入
编辑的
状态。有没有办法不用信号之类的
.save()
?我看了一下,但找不到任何有用的东西。我正在使用Django 1.7,但如果需要,我愿意升级到1.8

编辑:这里的主要问题是,我通过
ManyToManyField
将此模型附加到另一个模型,而另一个模型则使用表单进行渲染。用户进入站点,填写
editable字段
form.save()
然后保存主模型(并通过它保存
EditableField
记录)。

您可以为模型定义自定义方法,并截取
属性的设置:

class EditableField(models.Model):    
    ...    
    def __setattr__(self, name, value):
        if name == 'value':
            print u'The "value" attr is set to {}'.format(value)
        super(EditableField, self).__setattr__(name, value)

事实上,正如你所说,Django有可用的信号,我不知道这是否是你想要的。它们的工作方式与数据库触发器类似


您也可以重写save()方法,但您已经说过不需要该解决方案。

update\u或\u create方法可以用作一个线性代码。我已经尝试过这个方法,但它会引发
keyrorm:“state”
。此外,由于
protected=True
的原因,我无法直接修改
state
字段的值(我真的不想这样做,因为我的注释会受到影响)。Django的任何信号都不适用于海报的问题。是的,它们适用于OP要求的内容,您必须按照另一个答案中的说明重写
\uuuu setattr\uuuuu
,或者将对属性中字段的访问权包装起来。如果你知道一种使用信号的方法,我知道我很想看看你是如何做到这一点的。