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

Python 使用嵌套架构更新对象的最佳方法,python,flask,serialization,flask-sqlalchemy,marshmallow,Python,Flask,Serialization,Flask Sqlalchemy,Marshmallow,我有两个模型:ArticleModel和TagModel和可能会对它们之间的许多关系产生影响。 我正在使用棉花糖进行[de]序列化 我希望更新或创建ArticleModel实例,并希望从前端获取以下数据 { 'title': 'article', 'tags': [1, 2, 4] // ids of TagModel instances } 我决定了 模式 class ArticlePutPostSchema(Schema): tags = fields.List(field

我有两个模型:
ArticleModel
TagModel
可能会对它们之间的许多关系产生影响。
我正在使用
棉花糖
进行[de]序列化

我希望更新或创建
ArticleModel
实例,并希望从
前端获取以下数据

{
  '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
但我认为,这是一种糟糕的方式

我还尝试应用一个字段

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

这也是一种不好的方式


如何解决这个问题?

一个好方法是在ArticlePutPostSchema中定义一个嵌套的模式,如前所述

使用嵌套模式,您的
数据['tags']
应该如下所示:

[{id: 1, name: 'foo'}, {id: 2, name: 'bar'}, ... ]
因此,您不必再查询TagModel


也许你必须重构你的ArticleModel和TagModel,这样才能像预期的那样工作。也就是说,您需要在两个类之间设置一个字符串。

TypeError:unhable类型:“dict”
返回jsonify(),200
class TagModelSchema(Schema):
    id = fields.Integer()
    name = fields.String()

class ArticlePutPostSchema(Schema):
    tags = fields.List(fields.Nested(TagModelSchema))
[{id: 1, name: 'foo'}, {id: 2, name: 'bar'}, ... ]