烧瓶棉花糖自定义字段

时间:2018-08-20 12:18:27

标签: mongoengine marshmallow

我用烧瓶棉花糖和mongoengine。

我的API服务器的flask-restplus也是如此。

这是我的api.py

class BoardSchema(ma.Schema):
    class Meta:
        fields = ('no', 'title', 'body', 'tags', 'created_at', 'views')

board_schema = BoardSchema()
boards_schema = BoardSchema(many=True)


class ArticleList(Resource):
    def get(self):
        articles = Board.objects.all()
        return boards_schema.jsonify(articles)

model.py

from datetime import datetime
from mongoengine import *
from config import DB_NAME


connect(DB_NAME)


class Board(Document):
    d = datetime.now()
    date = "{}-{}-{}".format(d.year, d.month, d.day)

    no = SequenceField()
    title = StringField(required=True)
    body = StringField(required=True)
    tags = ListField(StringField())
    likes = ListField(StringField())
    views = ListField(StringField())
    password = StringField(required=True)
    created_at = DateTimeField(default=date)
    updated_at = DateTimeField(default=date)

当我访问/ article时,结果如下->

{
  "body": "123", 
  "created_at": "2018-08-20T00:00:00+00:00", 
  "no": 1, 
  "tags": [
    "MySQL", 
    "C"
  ], 
  "title": "\ud14c\uc2a4\ud2b8", 
  "views": [
    "127.0.0.1"
  ]
}

"views"中,将添加阅读文章的ip。

但是我想统计所有视图列表并将其包括到我的结果中。

我想要的结果在这里。

{
  "body": "123", 
  "created_at": "2018-08-20T00:00:00+00:00", 
  "no": 1, 
  "tags": [
    "MySQL", 
    "C"
  ], 
  "title": "\ud14c\uc2a4\ud2b8", 
  "views": 20
}

我是烧瓶棉花糖的新手,所以我很困惑如何解决这个问题。

谢谢。

3 个答案:

答案 0 :(得分:0)

也许您可以这样尝试:

class BoardSchemaCustom(ma.ModelSchema):
    class Meta:
        model = Board

    views = ma.fields.method(deserialize="_custom_serializer")

    def _custom_serializer(self, obj):
        return len(obj.views)

创建自定义架构的实例:

custom_board_schema = BoardSchemaCustom()

并将其转储:

dump, errors = custom_board_schema.schema.dump(Board.query.first())
>>> dump

答案 1 :(得分:0)

我遇到了同样的问题。并且我的代码在安装 marshmallow-sqlalchemy

后有效
pip install marshmallow-sqlalchemy

请参阅官方文档 https://flask-marshmallow.readthedocs.io/en/latest/

答案 2 :(得分:0)

下面的代码段也可以工作:

class BoardSchemaCustom(ma.ModelSchema):
    class Meta:
        model = Board

    views = ma.fields.Function(lambda obj: len(obj.views))