2017-04-13 16 views
0

私はDjangoを使ってCeleryを使用して、Modelレコードに入れる必要があるJSON値を返す特定のタスクを処理しています。今すぐDjangoデータベースに保持する2つのオプションがあります。結果をデータベースにセラーリーワーカーから返します。結果を返します。

  1. タスク署名の一部としてレコードのIDを渡します。その後、セロリはupdateレコードにそれを使用することができます。
  2. また、タスクの結果を返すことができ、django-db結果バックエンドをCeleryのために有効にすることができます。これはCelery独自のtask_resultテーブルに格納されます。これは、AsyncResult Idをレコード内に保持しなければならないことを意味し、クライアントがレコードを要求するたびに、処理が完了したかどうか調べます。

私にはオプション1が良いと思われますが、近年セロリーで働いていないので、私はそこに欠点があるかどうか、そして/またはどちらの状況がより適切かを知りたいために。

ありがとうございます!

答えて

1

いいえいいえ、最初のアプローチで何も問題はありません。セロリのインポートタスクあなたは、原子コミットするために、このサンプルコードを使用することができます

@task 
def update_model(id): 
    model_obj = your_model.objects.get(id=id) 
    #do your stuffs here... 

views.py

from app.tasks import update_model 

def your_view(request): 
    #your code 
    update_model.delay(id_of_the_instance_you_want_to_update) 

からapp.models輸入your_model から

tasks.py データベース。あなたが心配している場合(セロリから取られたdocs

from functools import partial 
from django.db import transaction 

from .models import Article, Log 
from .tasks import send_article_created_notification 

def create_article(request): 
    with transaction.atomic(): 
     article = Article.objects.create(**request.POST) 
     # send this task only if the rest of the transaction succeeds. 
     transaction.on_commit(partial(
      send_article_created_notification.delay, article_id=article.pk)) 
     Log.objects.create(type=Log.ARTICLE_CREATED, object_pk=article.pk) 
関連する問題