Django 将OrderedDict作为芹菜任务参数传递是否可以?

Django 将OrderedDict作为芹菜任务参数传递是否可以?,django,django-rest-framework,celery,django-celery,ordereddict,Django,Django Rest Framework,Celery,Django Celery,Ordereddict,我在Django REST框架的序列化程序中有一个重写的update方法 在这次更新中,由于用户可以发送很多孩子,我有一个异步芹菜任务处理孩子们,来处理孩子们 class MyModelSerializer(serializers.ModelSerializer): .... @transaction.atomic def update(self, mymodel, validated_data): try: children_d

我在Django REST框架的序列化程序中有一个重写的
update
方法
在这次
更新中
,由于用户可以发送很多孩子,我有一个异步芹菜任务
处理孩子们
,来处理孩子们

class MyModelSerializer(serializers.ModelSerializer):
    ....

    @transaction.atomic
    def update(self, mymodel, validated_data):
        try:
            children_data = validated_data.pop('children')
            transaction.on_commit(lambda: process_children.apply_async(
                countdown=1,
                args=[mymodel.id, children_data]))
        except KeyError:
            pass
        ...
在args中,有一个参数不是
json
对象,而是
orderedict
子数据

该任务看起来像:

@app.task
def process_children(mymodel_id, children_data):
    mymodel = MyModel.objects.get(pk=mymodel_id)
    children = mymodel.children.all()
    for child_data in children_data:
        try:
            child = children.get(start=child_data['start'])
            child = populate_child(child, child_data)
            child.save()
        except Child.DoesNotExist:
            create_child(mymodel, child_data)
我读到我们应该只发送
json
(或pickle、yaml,无论什么…)arg。
  • 但这种设置似乎有效
  • 我甚至可以发送
    datetime
    对象(即,我在任务中使用的
    start
    属性将存储的子对象与通过api发送的新值相匹配)
那么这里发生了什么?
  • 一切正常吗,芹菜像老板一样序列化和反序列化
  • 或者我疯了,应该在调用任务之前序列化,并在任务内部反序列化
[更新,添加芹菜设置]
您使用的是pickle序列化程序,它可以相对较好地处理对象,但存在一些问题

是的,你做得对

如中所述

客户端和工作者之间传输的数据需要序列化,因此芹菜中的每条消息都有一个content_类型的头,该头描述了用于编码它的序列化方法

另外,芹菜4.0的默认序列化程序是JSON(之前是
pickle
)。因此,无论何时调用此任务,芹菜在默认情况下都是序列化和反序列化它。 如果要使用任何其他序列化程序,则在调用任务时需要指定
内容类型
(如果使用
.delay
,则默认情况下序列化程序将为
json

process_children.apply_async((model_id, children_data), serializer='pickle')

您是否尝试过记录(儿童数据)
所以它在被发送到任务之前被转换成一个普通的dict?使用
dict
比使用
OrderedDict
更好吗?现在的重点是什么,一切似乎都在测试和生产中工作?我的问题更多的是它是正确的还是我应该在
json
中对自己进行序列化和反序列化。对不起我忘了显示我的芹菜设置,我将添加它,但我使用的是
json
,从未收到过博客文章中解释的运行时错误。奇怪。有序的dicts可能会被序列化,但日期时间应该会中断。是的,我还有十进制字段:/in,其中明确表示
Date
Decimal
不接受。我将再次检查是否未使用腌菜。
process_children.apply_async((model_id, children_data), serializer='pickle')