在烧瓶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
答案 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>