Python 芹菜任务中的数据库已过时

Python 芹菜任务中的数据库已过时,python,django,celery,django-celery,Python,Django,Celery,Django Celery,我有Django==2.2.8和芹菜==4.3.0,redis作为经纪人 使用非常简单的drf视图创建银行条目 def创建(self、request、*args、**kwargs): serializer=self.get\u序列化程序(data=request.data) serializer.is\u有效(raise\u exception=True) instance=serializer.save() bank\u entry=BankEntries.objects.get(pk=ins

我有Django==2.2.8和芹菜==4.3.0,redis作为经纪人

使用非常简单的
drf
视图创建
银行条目

def创建(self、request、*args、**kwargs):
serializer=self.get\u序列化程序(data=request.data)
serializer.is\u有效(raise\u exception=True)
instance=serializer.save()
bank\u entry=BankEntries.objects.get(pk=instance.id)

async_task=async_create_transactions.delay(bank_entry.pk)最可能发生的情况是,您的后台任务正在尝试在
序列化程序.save()完全完成之前访问数据库项。我以前也遇到过类似的问题

您可以做的是在调用
async\u create\u事务
后添加一个短延迟,这将为记录保存完成提供时间。所以你可以这样做:

from time import sleep

@celery_app.task()
def async_create_transactions(entry_id):
    sleep(1)
    bank_entry = BankEntries.objects.filter(pk=entry_id).first()
    if bank_entry: 
        return bank_entry.create_entries()

这可能不是最优雅的解决方案,但它在很多情况下都对我有效。

您是否在
银行条目表中使用uuid作为主键?@NafeesAnwar更新了代码,为了表明我确信创建了bank_条目并用idin替换了pk,在我的案例中,异步_create_事务始终获取条目_id,这意味着创建了该对象。Doc说pk是通过数据库计算的是的,时间。睡眠(3)对我来说很有效,只是好奇怎么会发生这种情况,model.create()是同步函数如果我得到了对象的id,这意味着插入查询已经完成了查看以下答案: