Зефир сериализует только один документ в MongoEngine ListField
Я создаю простой API, который извлекает изображения из URL и сохраняет их в mongodb. Пользователь отправляет URL в API для отправки нового задания. Затем пользователь может проверить состояние задачи и получить список полученных изображений через POST
метод:
def get_image_task(self, task_id):
try:
return ImageTask.objects.get(task_id=task_id)
except ImageTask.DoesNotExist:
return None
def post(self):
'''
Get status of submitted task.
'''
json_data = api.payload
task_id = json_data['task_id']
image = self.get_image_task(task_id)
if not image:
abort(404, 'Task does not exist.')
celery_task = AsyncResult(image.task_id)
image.task_status = celery_task.state
image.save()
return ImagePOSTOutput.dump(image)
Вот мои модели для ImageTask
а также Image
:
from flask_mongoengine import Document
from mongoengine import (
EmbeddedDocument,
StringField,
IntField,
BinaryField,
EmbeddedDocumentField,
ListField,
)
class Image(EmbeddedDocument):
id = IntField()
img = BinaryField()
class ImageTask(Task):
images = ListField(EmbeddedDocumentField(Image))
@classmethod
def pre_save(cls, sender, document, **kwargs):
if not document.task_id:
celery_task = get_images.apply_async((document.url, ))
document.task_id = celery_task.id
document.task_status = celery_task.state
И вот мои сериализаторы:
from marshmallow_mongoengine import ModelSchema
from .models import ImageTask, Image
class ImageSchema(ModelSchema):
'''
Embedded image schema for Image model.
'''
class Meta:
model = Image
exclude = ('img', )
class ImageTaskSchema(ModelSchema):
'''
ImageTaskSchema schema for generating JSON response
based on ImageTask model.
'''
images = ImageSchema(many=True)
class Meta:
model = ImageTask
# PUT /images endpoint request and response schemas
ImagePUTInput = ImageTaskSchema(only=('url', ))
ImagePUTOutput = ImageTaskSchema(only=(
'task_id',
'task_status',
))
# POST /images endpoint request and response schemas
ImagePOSTInput = ImageTaskSchema(only=('task_id', ))
ImagePOSTOutput = ImageTaskSchema(only=('task_id', 'task_status', 'images.id'))
Теперь после отправки нового задания я отправляю POST
запросить получение списка изображений и получить следующий ответ:
{
"task_status": "SUCCESS",
"task_id": "556f5b48-16fd-4775-aabf-a8fb14df0d08",
"images": {
"id": 0
}
}
Список изображений показывает, что только одно изображение было выбрано и сохранено в базе данных, хотя MongoDb показывает, что для этой задачи хранится более одного изображения: Я следовал официальным документам Marshamallow, чтобы мой ImagePOSTOutput
только сериализатор вернулся id
в JSON результат, как это было показано с schema = SiteSchema(only=['blog.author.email'])
, Я тоже пытался удалить only
параметр для ImagePOSTOutput
, но тогда ответ приходит без списка изображений:
{
"task_status": "SUCCESS",
"task_id": "556f5b48-16fd-4775-aabf-a8fb14df0d08"
}
Вопрос: почему зефир сериализует только один вложенный документ из ListField
и игнорирует все остальные вложенные документы? Что я забыл сделать?
PS: я использую Marshamllow-Mongoengine для сериализации объектов.