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

2024-09-22 16:32:11 发布

您现在位置:Python中文网/ 问答频道 /正文

在flask 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

Tags: 方法nameidjsonflaskreturnputschema
2条回答

我找到了一个办法,但不确定这是不是最好的办法。 因此,我们在模型上创建新的函数来更新和传递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()

现在在resource中,我们使用来自请求的输入JSON调用update函数。你知道吗

@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

这是可行的,但仍然不确定是否有任何最好的方法来做到这一点。你知道吗

我是这样做的:

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

  • 当收到请求时,首先使用棉花糖来验证数据。你可以用webargs来做这个。它由棉花糖开发团队维护。它抛出相应的HTTP错误(如果请求格式不正确,则为400;如果是正确的json,但验证失败,则为422)。

  • 认沽期权没有普遍的规则。从资源的角度来看,放置在一个项目上意味着替换整个项目(而不是补丁)。这并不意味着它要替换数据库中的整个项,因为可能存在用户无法修改的字段(ID、created\u at、updated\u at或其他一些可能在另一个资源中公开的字段,这取决于具体情况)。你答案中的update_to_db方法看起来不错。

注意:在写入数据库时,您仍然必须捕获潜在的错误(数据库连接错误、找不到项、完整性错误(无效外键),…),但至少验证会尽快进行。你知道吗

相关问题 更多 >