Estoy usando Celery con Django para procesar una determinada tarea que devuelve un valor JSON que debe colocarse en un registro de modelo. En este momento veo 2 opciones para persistir en la base de datos de Django:
update el registro.django-db para Celery, que vivirá en la propia tabla task_result de Celery. Esto significa que tendré que persistir el ID de AsyncResult dentro del registro, y cada vez que el cliente solicite el registro, buscaré y veré si el proceso se completó o no.A mí me parece que la opción 1 es mejor, pero como no he trabajado con Celery en los últimos años, quiero saber si tiene inconvenientes y/o para qué situación sería más adecuada la opción 2.
¡Gracias!
No, no hay nada malo con el primer enfoque.
tareas.py de app.models importa tu_modelo de la tarea de importación de apio
@task def update_model(id): model_obj = your_model.objects.get(id=id) #do your stuffs here...vistas.py
from app.tasks import update_model def your_view(request): #your code update_model.delay(id_of_the_instance_you_want_to_update)Puede usar este código de ejemplo para confirmaciones atómicas en la base de datos. Si está preocupado (tomado de celery 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)