Django 将OrderedDict作为芹菜任务参数传递是否可以?
我在Django REST框架的序列化程序中有一个重写的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
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')