使用嵌套架构更新对象的最佳方法



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

我想更新或创建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}].

这也是一种糟糕的方式。

如何解决?

执行此操作的一个好方法是在 ArticlePutPostSchema 中定义嵌套架构,如此处所述。

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才能按预期工作。 也就是说,你需要两个类之间的db.relations((。

相关内容

  • 没有找到相关文章

最新更新