У меня есть внутри сериализатора Django REST Framework переопределенный метод update
.
В этом update
, поскольку пользователь может отправлять много дочерних элементов, у меня есть асинхронная задача Celery 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).
Так что же здесь происходит?
- Все ли в порядке, сельдерей сериализует и десериализует OrderedDict как босс.
- Или я сумасшедший и должен сериализовать перед вызовом задачи и десериализовать внутри задачи?
[ОБНОВЛЕНИЕ, добавление настроек CELERY]
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'
dict(children_data)
преобразовать его в обычный дикт перед отправкой на задание? - person Nour Wolf   schedule 06.11.2018dict
, чемOrderedDict
? В чем смысл, пока вроде все работает в тесте и продакшене? Мой вопрос больше в том, правильно ли это или я должен перейти к сериализации и десериализации себя вjson
. - person Sifnos   schedule 07.11.2018