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
,或者将对属性中字段的访问权包装起来。如果你知道一种使用信号的方法,我知道我很想看看你是如何做到这一点的。