Лучший способ обновить объект с вложенной схемой - PullRequest
3 голосов

У меня две модели: ArticleModel и TagModel и 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}].

Это тоже плохой способ.

Как решить?

1 Ответ

2 голосов
/ 29 мая 2020

Хороший способ сделать это - определить вложенную схему в 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.relationship () между двумя классами.

...