我有以下型号:
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
记录)。
答案 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)
你也可以覆盖save()方法,但你已经说过你不想要那个解决方案。