gpt4 book ai didi

python - 使用棉花糖中的数据更新行 (SQLAlchemy)

转载 作者:IT老高 更新时间:2023-10-28 21:18:34 26 4
gpt4 key购买 nike

我正在使用 Flask、Flask-SQLAlchemy、Flask-Marshmallow + marshmallow-sqlalchemy,试图实现 REST api PUT 方法。我还没有找到任何使用 SQLA 和 Marshmallow 实现更新的教程。

代码如下:

class NodeSchema(ma.Schema):
# ...


class NodeAPI(MethodView):
decorators = [login_required, ]
model = Node

def get_queryset(self):
if g.user.is_admin:
return self.model.query
return self.model.query.filter(self.model.owner == g.user)

def put(self, node_id):
json_data = request.get_json()
if not json_data:
return jsonify({'message': 'Invalid request'}), 400

# Here is part which I can't make it work for me
data, errors = node_schema.load(json_data)
if errors:
return jsonify(errors), 422

queryset = self.get_queryset()


node = queryset.filter(Node.id == node_id).first_or_404()
# Here I need some way to update this object
node.update(data) #=> raises AttributeError: 'Node' object has no attribute 'update'

# Also tried:
# node = queryset.filter(Node.id == node_id)
# node.update(data) <-- It doesn't if know there is any object
# Wrote testcase, when user1 tries to modify node of user2. Node doesn't change (OK), but user1 gets status code 200 (NOT OK).

db.session.commit()
return jsonify(), 200

最佳答案

更新

marshmallow-sqlalchemy 扩展 ModelSchema 而不是 Flask-Marshmallow 你有:

load(data, session=None, instance=None, *args, **kwargs)

然后你必须将正在编辑的对象作为参数传递到 schema.load() 中,像这样:

node_schema.load(json_data, instance=Node().query.get(node_id))

如果你想在没有Model的所有必填字段的情况下加载,你可以添加partial=True,像这样:

node_schema.load(json_data, instance=Node().query.get(node_id), partial=True)

查看文档 marshmallow_sqlalchemy.ModelSchema.load

关于python - 使用棉花糖中的数据更新行 (SQLAlchemy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31891676/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com