【问题标题】:flask-marshmallow custom fields烧瓶棉花糖自定义字段
【发布时间】:2018-08-20 12:18:27
【问题描述】:

我使用flask-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)

模型.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
}

我是 flask-marshmallow 的新手,所以我很困惑如何解决这个问题。

谢谢。

【问题讨论】:

  • 首先应该按StringField类型查看?如果它是整数会更容易。
  • 我看不到你查看单篇文章的逻辑/端点,但你可以像这样增加查看次数:single_article = Board.objects.first()single_article.views = single_article.views + 1
  • 可能是IntField,所以声明views = IntField()
  • @needtobe views 必须是 StringFieldListField 内。因为每个查看者的 IP 地址都将存储在视图字段中。因此,一个 ip 可以增加一个查看次数。
  • @needtobe 所以,我想计算所有视图并将其表示为我的结果。

标签: mongoengine marshmallow


【解决方案1】:

也许你可以这样尝试:

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

【讨论】:

  • 也许flask-marshmallow 没有ModelSchema 属性。我在写完你的代码后运行,它在class BoardSchemaCuston(ma.ModelSchema): 处抛出AttributeError: 'Marshmallow' object has no attribute 'ModelSchema' 错误
  • Flask-marshmallow 有 ModelSchema 属性,看这里 (flask-marshmallow.readthedocs.io/en/latest)
  • 试试这样:from flask_marshmallow import Marshmallow ma = Marshmallow(app) 然后ma.ModelSchema
  • 我的代码已经和你的代码一样了。但它会抛出错误。在文档中,该示例使用 sqlalchemy。但我的数据库是 mongodb。也许它发生了错误?
  • 不,我不这么认为,对于 mongo:github.com/touilleMan/marshmallow-mongoengine/blob/master/docs/…
【解决方案2】:

我也遇到了同样的问题。我的代码在安装 ma​​rshmallow-sqlalchemy

后工作
pip install marshmallow-sqlalchemy

见官方文档 https://flask-marshmallow.readthedocs.io/en/latest/

【讨论】:

    【解决方案3】:

    低于 sn-p 也可以:

    class BoardSchemaCustom(ma.ModelSchema):
        class Meta:
            model = Board
    
        views = ma.fields.Function(lambda obj: len(obj.views))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 2020-09-23
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多