Зефир сериализует только один документ в MongoEngine ListField - PullRequest
0 голосов
/ 28 декабря 2018

Я создаю простой 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 показывает, что для этой задачи сохранено более одного изображения: enter image description here Я следовал официальным Документам о Зефире , так что мой *Сериализатор 1022 * вернул id только в результате json, как было показано с schema = SiteSchema(only=['blog.author.email']).Я также попытался удалить параметр only для ImagePOSTOutput, но затем ответ приходит без списка изображений:

{
     "task_status": "SUCCESS",
     "task_id": "556f5b48-16fd-4775-aabf-a8fb14df0d08"
}

Вопрос : почему зефир сериализует только один внедренный документ из ListField и игнорирует все остальные вложенные документы?Что я забыл сделать?

PS: я использую Marshamllow-Mongoengine для сериализации объектов.

...