我在 Django REST Framework 的序列化程序中有一个被覆盖的update
方法。
在此update
,由于用户可以发送很多孩子,我有一个异步芹菜任务process_children
来处理孩子。
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
对象而是OrderedDict
: children_data
。
任务看起来像:
@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
(或泡菜,yaml,无论如何......)args。
- 但是这个设置似乎有效
- 我什至可以发送
datetime
对象(即start
我在任务中使用的属性来匹配存储的孩子与通过 api 发送的新值)。
那么这里发生了什么?
- 一切正常吗,celery 像老大一样对 OrderedDict 进行序列化和反序列化。
- 或者我疯了,应该在调用任务之前序列化并在任务内部反序列化?
[更新,添加芹菜设置]
CELERY_BROKER_URL = get_env_variable('REDIS_URL')
CELERY_BROKER_POOL_LIMIT = 0
CELERY_REDIS_MAX_CONNECTIONS = 10
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/London'