簡體   English   中英

在Celery任務中保存對象后,Django匹配查詢不存在

[英]Django matching query does not exist after object save in Celery task

我有以下代碼:

@task()
def handle_upload(title, temp_file, user_id):
    .
    .
    .
    photo.save()
    #if i insert here "photo2 = Photo.objects.get(pk=photo.pk)" it works, including the         view function
    return photo.pk

#view function
def upload_status(request):
    task_id = request.POST['task_id']

    async_result = AsyncResult(task_id)
    photo_id = async_result.get()
    if async_result.successful(): 
        photo = Photo.objects.get(pk=photo_id)

我使用ajax請求檢查上傳的文件,但是在celery任務完成后,我得到一個不存在照片匹配查詢。 照片pk確實存在並返回。 如果我手動查詢數據庫,它將起作用。 這是某種數據庫滯后嗎? 我該如何解決? 我正在使用Django 1.4和Celery 3.0

您可以通過在您的django視圖中添加延遲來確認是否是滯后問題,以在任務成功完成幾秒鍾后等待。 如果這樣可以解決問題,則可能需要將handle_upload包裝在事務中以阻塞,直到數據庫在返回之前完全確認它已完成。

除了Django外,DB也有自己的緩存。 當django調用queryset時,它會從自己的緩存中獲取陳舊的數據(除非您正在重用queryset(除非在您發布的代碼部分中沒有看到),否則不太可能),或者DB正在為同一Django連接緩存結果。

例如,如果您在一個全新的Django請求/視圖中完成celery任務后調用后處理,則您可能會看到DB中的新更改就好了。 但是,由於在執行任務時視圖被阻塞(這與celery btw的目的背道而馳),因此內部django僅在進入視圖時保留數據庫的快照。 因此,您的獲取失敗,您僅在進入django shell時就直接確認了此行為。

您可以通過以下任一方法來解決此問題:

  • 調用將刷新快照的事務管理
  • 更改數據庫端點緩存和自動提交策略
  • 一旦celery完成處理以結束處理(使celery回調到django(Web請求)),無論如何,這都是您想做的,因為阻止django破壞了目標)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM