在Django中提交事务后运行代码

Gré*_*het 17 django signals transactions commit

在Django中提交事务后有没有办法运行一些代码?

我需要向rabbitmq服务器发送一些消息以进行离线处理,但是在提交Django事务之前,消息会传递给消费者.

我的消息是在模型的post_save信号中发送的.我正在寻找的是一种类似的机制,使用信号或其他东西,它将在提交后执行代码(如果事务失败则不执行任何操作).

我没有在Django中找到任何通用的方法.你有什么想法?

Car*_*yer 10

更新2:django-transaction-hooks被合并到Django核心并在Django 1.9版本中发布.

更新:django-transaction-hooks解决了这个问题.

我不相信有一个干净的方法来做到这一点; 至少我想不出一个.您可以使用monkeypatch django.db.transaction.commit发送自定义信号; 不漂亮,但我认为它会起作用.

django-developers邮件列表中提出这个用例可能也很有趣.开发人员通常不愿意添加新信号,但是你可能在这里有一个很好的案例(来自核心开发者的反驳可能包括如何解决你的情况的有用建议).如果你等到1.1出来之后,你更有可能得到回应.


小智 9

希望这可以帮助使用Django 1.9或更高版本的人.从1.9开始,on_commit可用.

所以基本上你会这样做:

from django.db import transaction

transaction.on_commit(
    lambda: send_msg_to_rabbitmqp(param1, param2, ...)
)
Run Code Online (Sandbox Code Playgroud)

如果你想保留post_save,你仍然可以使用on_commit:

@receiver(pre_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
    transaction.on_commit(
        lambda: send_msg_to_rabbitmqp(instance.id)
    )
Run Code Online (Sandbox Code Playgroud)


Gré*_*het 5

我通过猴子修补django 实现了交易信号(post_commitpost_rollback):http: //gist.github.com/247844