Django基于“子模型”(具有到父模型的fk的模型)管理父模型的状态

时间:2018-01-10 10:06:29

标签: python django django-models django-fsm

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

我正在使用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完成后自动完成,如何实现

2 个答案:

答案 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()