Celery在将我的queryset obj作为参数传递时引发错误 [英] Celery raise error while passing my queryset obj as parameter
问题描述
我试图执行定期任务,因此我将芹菜与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屋!