其实也就是数据库事务.

    看这段代码

    1. flow.version.finish_time = timezone.now()
    2. flow.version.save()
    3. change_version_sort.delay()

    如果,change_version_sort函数中也有调用version.save().可能会导致获取不到带finish_time的信息.然后再调用version.save()时,会用自身的null值将原有的变化覆盖掉.

    初级解决方案是在change_version_sort中的save指定update_fields.也就是

    1. version.save(update_fields=['sort'])

    这样可以一定程度上规避此问题,但是并不是正确的解决方案.并且如果外层也改了这个参数,仍然会覆盖.
    正确的解决方案是利用数据库事务来保证这段代码的先后执行顺序.

    1. flow.version.finish_time = timezone.now()
    2. flow.version.save()
    3. transaction.on_commit(lambda: change_version_sort.delay())

    django 提供的事务模块中有on_commit方法.可以确保在当前事务执行完毕后再执行下一个事务.

    文档参考:https://docs.djangoproject.com/zh-hans/4.0/topics/db/transactions/