设计一个需要基于其他模型转换的模型状态转换的系统。
我正在使用Django FSM
示例:
class Foo(models.Model):
baz = models.Charfield()
state = FSMField(default='new')
class Bar(models.Model):
x = models.CharField()
state = FSMField(default='draft')
foo = models.ForeignKey(Foo)
用例:
Foo可以具有以下状态 - 新的,草稿,完成,pending_approval,已批准 Foo可以有多个条
Bar可以具有以下状态 - 草稿,完整
Foo应该在所有Bar完成后自动完成,如何实现
答案 0 :(得分:0)
取决于用例,但您可以这样做:
每次完成任何条形图后,您都会检查Foo
对象是否已完成所有Bar
。
class Bar(models.Model):
x = models.CharField()
state = FSMField(default='draft')
foo = models.ForeignKey(Foo)
def save(self,*args,**kwargs):
if not self.foo.bar_set.exclude(state='complete'):
self.foo.state = 'complete'
self.foo.save()
super().save(*args,**kwargs)
答案 1 :(得分:0)
我根本不了解django-fsm,但是快速查看文档后会有一个post_transition
signal在实例更改其状态后触发。因此,您可以定义一个侦听Bar,然后检查实例的Foo对象是否只完成了Bars。类似的东西:
@receiver(post_transition, sender=Bar)
def check_completed(sender, instance, name, source, target):
if target == 'completed':
if not instance.foo.bar_set.filter(state='draft').exists():
instance.foo.state = 'completed'
instance.foo.save()