我有一个用户更新功能,我允许用户更改他们的电子邮件地址,但是相同的地址在数据库中必须是唯一的,因此,在我更新之前,我必须检查他们的新电子邮件是否已存在于数据库中,但查询我用于检查返回同一行。例如:
user = User.query.get(1)
user.email = 'some@email.com'
if user.validate(): # The validate function performs a query to see if 'some@email.com' is already taken
user.save()
现在进入我的验证功能:
check = User.query.filter_by(User.email='some@email.com').first()
if check:
# email already exists
问题是check
拥有我正在编辑的同一个用户。 Sqlalchemy将更新提交给数据库但在某种事务下,所以我的查询返回我正在编辑的同一用户。我已经通过创建第二个会话对象来解决这个问题,但看起来有点过分。有更好的想法吗?我有道理吗?
答案 0 :(得分:1)
在操作现有用户之前,为什么不检查具有给定电子邮件地址的用户是否存在?你可以,例如为此写一个独立的函数:
def user_email_exists(email):
return (not User.query.filter(User.email=email) == None)
然后在尝试更改用户对象之前调用user_email_exists
。
...
# User object to alter
user = ...
# the new email address, which needs to be checked
new_email_addr = 'new@shiny.com'
if user_email_exists(new_email_addr):
raise SomeMeaningfulException() # or some `flash` message + a redirect
else:
user.email = new_email_addr
db.session.add(user)
db.commit()
...
答案 1 :(得分:0)
最简单的方法可能就是在验证函数中为查询添加第二个过滤器。不要让它选择具有该电子邮件地址的任何用户,而是选择具有该电子邮件地址且不具有相同用户名或用户ID的任何用户。这样,如果有不同的用户使用该电子邮件地址,您只能确保获得退货。