如何在Flask中部分执行更新?

时间:2019-04-03 14:19:17

标签: python flask flask-restful marshmallow

在烧瓶restul的部分字段中,是否仍要使用PUT方法进行更新?

当前,我的PUT方法执行此操作,但是如果不存在该字段,则会抛出错误。

item = ItemModel.find_by_id(id)
    item_json = request.get_json()

    if(item):
        item.name = item_json['name']
        item.code = item_json['code']
        item.tags = item_json['tags']
    else:
        try:
            item = item_schema.load(
                item_json
            )
         except ValidationError as err:
            return err.messages, HTTPStatus.BAD_REQUEST

    item.save_to_db()
    return {'message': item_schema.dump(item)}, HTTPStatus.OK

2 个答案:

答案 0 :(得分:0)

我找到了一种方法,但不确定是否是最佳方法。 因此,我们在模型上创建了新功能,以更新和传递JSON对象并使用该对象设置属性。

from . import db


class ItemModel(db.Model):
    __tablename__ = "items"

    id = db.Column(db.Integer, primary_key=True)
    code = db.Column(db.String(), nullable=False)
    name = db.Column(db.String(), nullable=False)
    tags = db.Column(db.String(), nullable=False)
    created_at = db.Column(db.DateTime, server_default=db.func.now())
    updated_at = db.Column(
        db.DateTime,
        server_default=db.func.now(),
        server_onupdate=db.func.now()
    )

    def update_to_db(self, data):
        for key, value in data.items():
            setattr(self, key, value)
        db.session.commit()

现在在资源中,我们使用来自请求的输入JSON调用更新功能。

@classmethod
def put(self, id: int):
    item = ItemModel.find_by_id(id)

    if(item):
        try:
            item.update_to_db(
                request.get_json()
            )
        except ValidationError as err:
            return err.messages, HTTPStatus.BAD_REQUEST

        return {'message': item_schema.dump(item)}, HTTPStatus.OK

    return {'message': gettext('item_not_found')}, HTTPStatus.NOT_FOUND

这是可行的,但仍不确定是否有最佳方法来实现。

答案 1 :(得分:0)

这就是我要做的:

  • 使用POST方法创建新项目,并使用PUT方法更新项目。

  • 在接收到请求后,首先使用棉花糖Schema验证数据。您可以使用webargs。它由棉花糖开发团队维护。它将引发适当的HTTP错误(如果请求格式错误,则为400;如果是正确的json但验证失败,则为422)。

  • PUT没有通用规则。从资源的角度来看,项目上的PUT是要替换整个项目(而不是PATCH)。这并不意味着要替换数据库中的整个项目,因为可能存在用户无法修改的字段(ID,created_at,updated_at或其他资源中可能公开的其他字段,这实际上取决于)。您的答案中的update_to_db方法看起来不错。

请注意,在写入数据库时​​,您仍然必须捕获潜在的错误(数据库连接错误,未找到项,完整性错误(无效的外键),...),但至少要尽快进行验证。 / p>