【问题标题】:How to perform update partially in Flask?如何在 Flask 中执行部分更新?
【发布时间】:2020-08-05 02:24:14
【问题描述】:

有没有用 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

【问题讨论】:

    标签: python flask flask-restful marshmallow


    【解决方案1】:

    我找到了一种方法,但不确定它是否是最好的方法。 所以我们的想法是在模型上创建新函数来更新和传递 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
    

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

    【讨论】:

      【解决方案2】:

      这是我的工作:

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

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

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

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

      【讨论】:

      • 您是否尝试过改用ModelSchema?我想使用它,以便 require=True 之类的验证可以从 model 使用 nullable=False
      • 我对 SQLAlchemy 不是很熟悉,也没有看到你的所有代码。使用 marshmallow-sqlalchemy,我认为您可以从模型架构生成 API 架构,从而将不可为空的模型字段标记为必需。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多