我正在关注Flask-SQLalchemy update a row's information以尝试更新端点中的对象。我有:
def dashboard_presave_callback(data, existing_id=None):
# if existing_id, overwrite...else, make new item
print(data)
url_to = data.get('url_to', None)
print(url_to)
if isinstance(url_to, str):
pass
else:
url_to = json.dumps(url_to)
if existing_id:
data.update({'id': existing_id})
obj = DashboardItem.query.filter_by(id==existing_id).update(data)
# obj.update(data)
else:
obj = DashboardItem(**data)
DB.session.add(obj)
DB.session.commit()
class GenericApiView(JsonApiView):
# @jwt_required()
def post(self, model_type):
request_json = request.get_json()
dashboard_presave_callback(request_json)
return Response({'message': 'ok'}, 200)
def put(self, model_type):
request_json = request.get_json()
existing_id = request_json['id']
del request_json['id']
dashboard_presave_callback(request_json, existing_id)
return Response({'message': 'ok'}, 200)
模型看起来像
class DashboardItem(DB.Model):
__tablename__ = 'dashboard_item'
id = DB.Column(DB.Integer, primary_key=True)
user_email = DB.Column(DB.String(200), unique=True, nullable=False)
url_to = DB.Column(DB.Text)
display_text = DB.Column(DB.String(200), nullable=False)
# https://stackoverflow.com/questions/8098122/mongoengine-creation-time-attribute-in-document
def save(self, *args, **kwargs):
print('huh?')
print(args)
print(kwargs)
self.url_to = 'it worked'
return super(DashboardItem, self).save(*args, **kwargs)
我这样做是因为我的save
无效,但这种方式很好,因为我想在update
上做同样的行为。
我得到了
obj = DashboardItem.query.filter_by(id==existing_id).update(data)
TypeError: filter_by() takes exactly 1 argument (2 given)
似乎我在示例中做了同样的事情。为什么这个filter_by
不起作用?
答案 0 :(得分:3)
obj = DashboardItem.query.filter_by(id=existing_id).update(data)
你有一个额外的=
标志,让它传递一个布尔值。
filter_by
应该只接受一个DashboardItem.query
的参数。您已使用.
表示法隐式传递此内容。您需要提供的所有其他参数(包括id
)都是命名参数。