【问题标题】:What exactly is the attribute in marshmallow.fields.Nested() function?marshmallow.fields.Nested() 函数中的属性到底是什么?
【发布时间】:2020-07-17 22:42:58
【问题描述】:

我正在尝试将 Schema 嵌套在另一个 Schema 中,如下所示:

class RecipePaginationSchema(PaginationSchema):
    data = fields.Nested(RecipeSchema, attribute = "items", many = True)

结果应该是这样的:

{
    "links": {
        "first": "http://localhost:5000/users/name/recipes?per_page=2&visibility=all&page=1",
        "last": "http://localhost:5000/users/name/recipes?per_page=2&visibility=all&page=2",
        "next": "http://localhost:5000/users/name/recipes?per_page=2&visibility=all&page=2"
    },
    "page": 1,
    "pages": 2,
    "per_page": 2,
    "total": 3,
    "data": [
        {
            "id": 11,
            ...
        }
}

但是,当我尝试使用另一个属性而不是“项目”时,我没有得到 JSON 响应中的“数据”部分。那么,这个属性到底指的是什么?

顺便说一句,我正在关注 Packt 的 Python API 开发基础一书。

【问题讨论】:

  • 您提出了一个明确的问题并发布了一个格式化的问题。 +1

标签: python json flask schema marshmallow


【解决方案1】:

来自documentation

attribute – 序列化时获取值的属性名称。如果没有,则假定属性与字段具有相同的名称。注意:这应该只用于非常特定的用例,例如为单个属性输出多个字段。在大多数情况下,您应该改用 data_key。

换句话说,您将RecipePaginationSchema 中的字段“数据”映射到RecipeSchema 中的属性“items”。

我不知道您的用例,但如文档中所述,您应该使用属性关键字作为最后的手段。许多用例可以使用“only”和“exclude”关键字来解决(参见here)。

【讨论】:

  • 不完全是。这意味着用RecipeShema序列化的结构应该在整个数据结构中的“items”属性而不是“data”属性中进行序列化。实际上,如果您将字段命名为“items”并改用“data_key=data”,则可以避免使用属性。
  • 如果您将此作为答案发布,我会投赞成票。这个解释比我自己的要好得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2012-04-18
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多