当模型字段的值更改时运行一些代码

时间:2015-03-23 08:52:32

标签: python django django-models

我有以下型号:

class EditableField(models.Model):
    template = models.ForeignKey(FieldTemplate)
    value = models.CharField(max_length=255)
    state = FSMField(default='new', protected=True)

使用Django FSM我有以下状态机:

[*] --> new

new --> edited
new --> approved

edited --> approved
edited --> rejected

rejected --> edited

approved --> closed

closed --> [*]

(您可以使用PlantUML

对其进行可视化

如果您不了解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

现在,我想通过设置模型的edited字段来进入value状态。有没有办法在不使用.save()的情况下执行此操作,如信号或其他内容?我看了Documentation,但找不到任何可用的东西。我正在使用Django 1.7,但如果需要,我愿意升级到1.8。

编辑:这里的主要问题是我通过ManyToManyField将此模型附加到另一个模型,并使用表单呈现其他模型。用户转到该站点,填写EditableField值。 form.save()然后保存主模型(并通过它,EditableField记录)。

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

事实上,正如你所说,Django有可用的信号,https://docs.djangoproject.com/en/1.7/topics/signals/,我不知道这是不是你想要的。它们的工作方式与数据库触发器类似。

你也可以覆盖save()方法,但你已经说过你不想要那个解决方案。