Celery在将我的queryset obj作为参数传递时引发错误 [英] Celery raise error while passing my queryset obj as parameter

查看:386
本文介绍了Celery在将我的queryset obj作为参数传递时引发错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图执行定期任务,因此我将芹菜与Django 1.8和Django Rest Framework和Postgres一起用作数据库。当我尝试将obj发送到任务时,出现 TypeError:foreign_model_obj不能序列化JSON 。如何将我的queryset对象传递给我的任务。



views.py:



< pre class = lang-py prettyprint-override> class MyModelCreateApiView(generics.CreateAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
authentication_classes =(令牌认证,)

def create(self,request,* args,** kwargs):
data = dict()
data ['foreign_model_id'] = kwargs ['pk']
foreign_model_obj = MyForeignModel.objects.get(id = data ['foreign_model_id'])

obj = MyModel.objects.create(** data)
结果= serialize_query(MyModel,{ id:obj.id})
local_time = foreign_model_obj.time
my_celery_task.apply_async([foreign_model_obj],eta = local_time)
返回响应(结果)

tasks.py:

  @ celery_app.task(name = my_celery_task)
def my_first_celery_task(mymodel_obj):
#...正在更新obj属性
mymodel_obj.save()




解决方案

您只需发送 id 实例,然后在任务中检索对象。
传递实例是一个坏习惯,因为它可以同时更改 ,特别是您正在使用似乎延迟的方式执行任务。



views.py:

 类MyModelCreateApiView(generics.CreateAPIView):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
authentication_classes =(TokenAuthentication,)

def create(自我,要求,* args,** kwargs):
data = dict()
data ['foreign_model_id'] = kwargs ['pk']
foreign_model_obj = MyForeignModel.objects.get( id = data ['foreign_model_id'])

obj = MyModel.objects.create(** data)
结果= serialize_query(MyModel,{ id:obj.id})
local_time = foreign_model_obj.time
my_celery_task.apply_async([foreign_model_obj.id],eta = local_time)#仅发送obj id
返回响应e(结果)

tasks.py:

  @ celery_app.task(name = my_celery_task)
def my_celery_task (mymodel_obj_id):
my_model_obj = MyModel.objects.get(id = mymodel_obj_id)#在此处检索您的对象
#...更新obj属性
mymodel_obj.save()




I trying to execute a periodic task, so I used celery with Django 1.8 and Django Rest Framework and Postgres as Database. When I try to send my obj to the task I get TypeError: foreign_model_obj is not JSON serializable. How can I pass my queryset object to my Task.

views.py :

class MyModelCreateApiView(generics.CreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    authentication_classes = (TokenAuthentication,)

    def create(self, request, *args, **kwargs):
        data = dict()
        data['foreign_model_id'] = kwargs['pk']
        foreign_model_obj = MyForeignModel.objects.get(id=data['foreign_model_id'])

        obj = MyModel.objects.create(**data)
        result = serialize_query(MyModel, {"id": obj.id})
        local_time = foreign_model_obj.time
        my_celery_task.apply_async([foreign_model_obj], eta=local_time)
        return Response(result)

tasks.py :

@celery_app.task(name="my_celery_task")
def my_first_celery_task(mymodel_obj):
    # ... updating obj attributes
    mymodel_obj.save()

解决方案

You have just to send the id of your instance and retrieve the object within the task. It's a bad practice to pass the instance, since it can be altered in meantime, specially that you are excuting your task with a deplay as it seems to be.

views.py :

class MyModelCreateApiView(generics.CreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    authentication_classes = (TokenAuthentication,)

    def create(self, request, *args, **kwargs):
        data = dict()
        data['foreign_model_id'] = kwargs['pk']
        foreign_model_obj = MyForeignModel.objects.get(id=data['foreign_model_id'])

        obj = MyModel.objects.create(**data)
        result = serialize_query(MyModel, {"id": obj.id})
        local_time = foreign_model_obj.time
        my_celery_task.apply_async([foreign_model_obj.id], eta=local_time) # send only the obj id
        return Response(result)

tasks.py :

@celery_app.task(name="my_celery_task")
def my_celery_task(mymodel_obj_id):
    my_model_obj = MyModel.objects.get(id=mymodel_obj_id) # retrieve your object here
    # ... updating obj attributes
    mymodel_obj.save()

这篇关于Celery在将我的queryset obj作为参数传递时引发错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆