【问题标题】:Marshmallow result customization棉花糖结果定制
【发布时间】:2019-01-29 22:54:33
【问题描述】:

我有这个模型的带有 jsonb 字段和棉花糖模式的 sqlalchemy 模型:

class Settings(db.Model):
    id = db.Column(UUID, primary_key=True,
                   server_default=text("uuid_generate_v4()"))
    settings = db.Column(JSONB)

class SettingsSchema(ma.ModelSchema):
    class Meta:
        model = Settings

我在 json 中序列化它,例如:

settings = Settings(settings={'qwerty': 'test'})
settings_schema = SettingsSchema(many=False, exclude=('id', ))
body = settings_schema.dump(settings).data

模型的 json 视图如下所示:

{
  "settings": {
    "qwerty": "test"
  }
}

当我将此架构用作嵌套时,我的结果类似于

{
    "id": 123456,
    "some_field": "some_field_value",
    "other_field": "other_field_value",
    "settings": {
        "settings": {
            "qwerty": "test"
        }
    }
}

而且这个“settings.settings”看起来很丑。

有没有办法对棉花糖说我只需要值作为转储结果,我的意思是

{
    "qwerty": "test"
}

可能我需要对元类做点什么,但我不知道该怎么做。

【问题讨论】:

    标签: python sqlalchemy psycopg2 marshmallow


    【解决方案1】:

    我明白了。我应该在我的架构中使用@post_dump:

    class SettingsSchema(ma.ModelSchema):
    
        class Meta:
            model = WorkspaceSettings
    
        @post_dump(pass_many=True)
        def unwrap_settings(self, data, many):
    
            if many:
                return [item['settings'] or {} for item in data]
            else:
                return data['settings'] or {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2017-02-02
      • 2018-09-08
      • 2016-03-15
      • 1970-01-01
      • 2016-01-21
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多