Django模型没有保存到Celery Task内的数据库中

时间:2013-12-20 05:56:29

标签: python django postgresql redis celery

我遇到了一个非常糟糕的情况。我有以下设置。 我有一个代表FSM的django模型django FSM field

我有芹菜任务发送电子邮件,然后推进主要对象FSM的状态。从芹菜任务的角度来看,对象“似乎”得以保存。但是从主要的django进程的角度来看,对象没有被更新。奇怪的是,辅助对象正在被妥善保存到数据库中,以后可以从主django进程访问。

我在Celery任务中明确地调用了对象.save(),并且date_last_modified = models.DateTimeField(auto_now=True, null=True)字段在Celery任务中的时间戳晚于主线程,但我不确定这是否是一个指示任何东西,即它可能已被更新,但更新尚未刷新到数据库。

我正在使用django 1.5.1, postgresql 9.3.0, 芹菜v3.1.0, Redis 2.6.10

像这样运行芹菜 $ celery -A tracking worker -E -B -l info

非常感谢任何关于为什么会发生这种情况的想法

3 个答案:

答案 0 :(得分:3)

保存后您是否重新获取对象?即不只是看看你在保存之前得到的实例吗?

答案 1 :(得分:2)

我和Django 1.5有类似的问题

我想这是因为Django没有立即对数据库进行更改。

添加

    'OPTIONS': {
        'autocommit': True
    }

DATABASES设置为我解决了问题。

Django 1.6+中不存在问题beacuse autocommit是默认值。

答案 2 :(得分:1)

交易怎么样?您可以尝试设置CELERY_EAGER_PROPAGATES_EXCEPTIONS=True并使用-l DEBUG运行芹菜以查看模型.save()调用后是否发生任何错误。

还要处理并发更新。当一个进程读取模型时,芹菜会读取并保存相同的模型,如果初始进程稍后调用models.save(),它将覆盖其中的所有字段。