![](/img/trans.png)
[英]Matching query doesn't exist after a new object save in Django Admin and sent to Celery task
[英]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時就直接確認了此行為。
您可以通過以下任一方法來解決此問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.