python - Celery 在将我的查询集 obj 作为参数传递时引发错误

标签 python django postgresql django-rest-framework celery

我试图执行一个周期性任务,所以我将 celery 与 Django 1.8 和 Django Rest Framework 以及 Postgres 一起用作数据库。当我尝试将我的 obj 发送到任务时,我得到了 TypeError: foreign_model_obj is not JSON serializable。如何将我的查询集对象传递给我的任务。

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)

任务.py :

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

最佳答案

您只需发送实例的 id 并在任务中检索对象。 传递实例是一种不好的做法,因为它可以同时更改,特别是当你正在执行你的任务时,它似乎是这样。

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)

任务.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()

关于python - Celery 在将我的查询集 obj 作为参数传递时引发错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34765276/

相关文章:

Python 3.2.1 : Can't Index Shape, 稍后需要访问特定矩形

mysql - 从django中的不同主机访问数据库

python - 在 Django 中以不同模型的形式显示多对多?

django - http 403 错误 + "readv() failed (104: Connection reset by peer) while reading upstream"

postgresql - URL 文本字段的查询优化

python - 使用 PyBrain 进行神经网络训练不会收敛

python - 将 `null` 视为表唯一约束中的不同值

javascript - 如何修复 ajax 调用以便隐藏我的 token ?

SQL - min() 获得最低值,max() 获得最高值,如果我想要第二个(或第五个或第 n 个)最低值怎么办?

performance - Postgres Hstore 与 Redis - 性能方面