1

设计一个需要模型状态转换的系统,该模型基于其他模型的转换。

我正在使用 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 可以有以下状态 - new、draft、complete、pending_approval、approved Foo 可以有多个 Bars

酒吧可以有以下状态 - 草稿,完成

Foo 应该在所有 Bar 完成后自动完成,如何实现

4

2 回答 2

1

我根本不知道 django-fsm,但是通过快速查看文档,有一个post_transition信号在实例更改其状态后被触发。所以你可以定义一个监听 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()
于 2018-01-10T10:15:56.437 回答
0

取决于用例,但您可以通过以下方式执行此操作:

每次,任何 Bar 完成时,您检查它的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)
于 2018-01-10T10:14:59.080 回答