我使用Celery和Django来处理某个任务,该任务返回需要放入Model记录的JSON值。现在我看到有两个选项可以将它保存在Django数据库中:
update
。django-db
结果后端,后端将存在于Celery自己的task_result表中。这意味着我必须在记录中保留AsyncResult Id,并且每当客户端请求记录时,我都会查看并查看该过程是否完成。对我而言,似乎选项1更好,但由于我近年来没有与Celery合作过,我想知道它是否有缺点,和/或选项2哪种情况更适合
谢谢!
答案 0 :(得分:1)
第一种方法没有任何问题。
<强> tasks.py 强> 从app.models导入your_model 来自芹菜进口任务
@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)
您可以将此示例代码用于数据库中的原子提交。如果您担心(取自芹菜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)