【问题标题】:Best way for update object with Nested schema使用嵌套模式更新对象的最佳方式
【发布时间】:2020-05-28 14:08:22
【问题描述】:

我有两个模型:ArticleModelTagModelMay-To-Many 它们之间的关系。 我使用 marshmallow 进行 [de] 序列化。

我想更新或创建ArticleModel 实例,我想从front-end 获取以下数据

{
  'title': 'article',
  'tags': [1, 2, 4] // ids of TagModel instances
}

我决定了

模式

class ArticlePutPostSchema(Schema):
    tags = fields.List(fields.String())

查看

def post(self):
    json_data = request.get_json()
    data = ArticlePutPostSchema().load(data=json_data, partial=True)
    data["tags"] = list(
        TagModel.query.filter(TagModel.id.in_(data["tags"]))
    )
    article = ArticleModel(**data)
    db.session.add(article)
    db.session.commit()
    return jsonify(), 200

但我认为,这是不好的方式。

我还尝试应用Pluck 字段

Pluck(TagSchema, 'id', many=True)

我得到了[{'id': 1, 'id': 2, 'id': 4}]

这也是一种不好的方式。

如何解决?

【问题讨论】:

  • return jsonify(), 200

标签: python flask serialization flask-sqlalchemy marshmallow


【解决方案1】:

这样做的一个好方法是在 ArticlePutPostSchema 中定义一个嵌套模式,如 here 所述。

class TagModelSchema(Schema):
    id = fields.Integer()
    name = fields.String()

class ArticlePutPostSchema(Schema):
    tags = fields.List(fields.Nested(TagModelSchema))

使用嵌套架构,您的 data['tags'] 应该如下所示:

[{id: 1, name: 'foo'}, {id: 2, name: 'bar'}, ... ]

因此您不必再查询 TagModel。

也许您必须将 ArticleModel 重构为 TagModel 才能按预期工作。 IE。你需要两个类之间的db.relationship()

【讨论】:

  • TypeError: unhashable type: 'dict'
猜你喜欢
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多