marshmallow.fields.Nested() 函数中的属性到底是啥?

Posted

技术标签:

【中文标题】marshmallow.fields.Nested() 函数中的属性到底是啥?【英文标题】: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 【参考方案1】:

来自documentation:

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

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

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

【讨论】:

不完全是。这意味着用RecipeShema序列化的结构应该在整个数据结构中的“items”属性而不是“data”属性中进行序列化。实际上,如果您将字段命名为“items”并改用“data_key=data”,则可以避免使用属性。 如果您将此作为答案发布,我会投赞成票。这个解释比我自己的要好得多。

以上是关于marshmallow.fields.Nested() 函数中的属性到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章