Зефир EmbeddedDocument не работает - PullRequest
0 голосов
/ 07 ноября 2018

Я сделал простой интерфейс API с flask-restplus и mongoengie.

Также используйте marshmallow для сериализации данных.

Ниже кода теперь я работал.

[модель]

class Article(Document):
    no = SequenceField()
    subject = StringField(required=True)
    content = StringField(required=True)
    userid = StringField(required=True)
    comments = ListField(EmbeddedDocumentField(Comment))
    created_at = DateTimeField(default=datetime.datetime.now())
    updated_at = DateTimeField(default=datetime.datetime.now())


class Comment(EmbeddedDocument):
    content = StringField(required=True)
    userid = StringField(required=True)
    created_at = DateTimeField(default=datetime.datetime.now())

[сериализатору]

class CommentSchema(Schema):
    content = fields.String()
    userid = fields.String()
    created_at = fields.DateTime()

class ArticleSchema(Schema):
    comments = CommentSchema(many=True)
    class Meta:
        fields = ('no', 'subject', 'content', 'userid', 'comments', 'created_at', 'updated_at')

Я определил схему, следующую модели.

В ArticleSchema, чтобы показать комментарии, я определил comments = CommentSchema(many=True) и вставил его в fields.

Функция получения статьи здесь.

def get_all_articles():
    articles = Article.objects.all()
    data, errors = ArticleListSchema(many=True).dump(articles)
    return data

Но когда я получаю к нему доступ, возникает внутренняя ошибка и выдается сообщение об ошибке, подобное этому.

TypeError: Object of type Comment is not JSON serializable

После поиска в гугле я обнаружил некоторую функцию интереса, Nested. (https://marshmallow.readthedocs.io/en/3.0/nesting.html)

Итак, я изменил схему.

class ArticleSchema(Schema):
    no = fields.Integer()
    subject = fields.String()
    content = fields.String()
    userid = fields.String()
    comments = fields.Nested(CommentSchema())
    created_at = fields.DateTime()
    updated_at = fields.DateTime()

(comments = fields.Nested(CommentSchema())

Но это тоже не работает должным образом.

[результат]

{
    "subject": "string",
    "content": "string",
    "userid": "string",
    "updated_at": "2018-11-06T17:04:55.197000+00:00",
    "no": 20,
    "created_at": "2018-11-06T17:04:55.197000+00:00",
    "comments": {}
}

Я уже вставил 2 комментария, и результат mongodb,

> db.article.find()
{ "_id" : ObjectId("5be14bb61b48d9113e3d1413"), "no" : 20, "subject" : "string", "content" : "string", "userid" : "string", "comments" : [ { "content" : "cosdadas", "userid" : "123123", "created_at" : ISODate("2018-11-06T17:34:44.199Z") }, { "content" : "Second comment", "userid" : "john", "created_at" : ISODate("2018-11-06T17:34:44.199Z") } ], "created_at" : ISODate("2018-11-06T17:04:55.197Z"), "updated_at" : ISODate("2018-11-06T17:04:55.197Z") }

Но в API комментарии не отображаются. Просто пусто {}.

Есть ли здесь какое-нибудь решение?

Спасибо.

1 Ответ

0 голосов
/ 07 ноября 2018

[РЕШИТЬ]

Изменение

comments = fields.Nested(CommentSchema()) до

comments = fields.Nested(CommentSchema, many=True) и работает отлично.

...