2013-04-06 66 views
0

我使用的瓶+ Python和檢查,如果一個用戶名(和電子郵件)已經採取或不我用這樣的邏輯:如何使用SQLAlchemy獲取列值?

@app.route('/register', methods=['GET', 'POST']) 
def register(): 
    form = SignupForm() 
    if form.validate_on_submit(): 
     user = Users.query.filter_by(username=form.username.data).first() 
     email = Users.query.filter_by(email=form.email.data).first() 
     if form.username.data in user: 
     error = 'Username already taken. Choose another' 
     elif form.email.data in email: 
     error = 'Email already registered. Login or register with another Email' 
     else: 
      user = Users( 
      form.username.data, 
      form.password.data, 
      #form.confirm.data , 
      form.email.data, 
      1, 
      # form.cityaddress.data, 
      # form.countryaddress.data, 
      #form.accept_tos.data, 
    ) 
     db.session.add(user) 
     db.session.commit() 
     return redirect(url_for('index')) 

但它給錯誤樣object has no attribute 'username'

我知道我從數據庫獲取數據的邏輯不正確。我對SQLalchemy知之甚少。

你可以建議我如何可以獲取Username(和Email)列從表Users值,然後檢查他們是否有相同form.username.data

+0

你可以粘貼確切的錯誤,包括錯誤的行嗎? – Elrond 2013-04-06 12:03:26

回答

3

你的查詢顯得精緻,從first()返回值將是你的用戶對象,或None的實例,如果沒有結果:

u = Users.query.filter_by(username=form.username.data).first() 
    if u is not None: 
     print u.username 
     print u.email  

所以考慮到,這裏是你的邏輯可能是什麼樣子:

user_by_name = Users.query.filter_by(username=form.username.data).first() 
    user_by_email = Users.query.filter_by(email=form.email.data).first() 
    if user_by_name: 
    error = 'Username already taken. Choose another' 
    elif user_by_email: 
    error = 'Email already registered. Login or register with another Email' 
    else: 
     #Unique user and email 

你也可以做到在一個查詢:

existing = Users.query.filter((Users.username == form.username.data) | (Users.email == form.email.data)).all() 
if existing: 
    error = 'User or email taken' 

請注意,使用filter而不是filter_by - 您無法使用filter_by中的按位運算符。這裏有一個快速的working example

1

您的錯誤令我困惑。也就是說,除了測試以外,你的代碼看起來很好。我用這個,然後:

user = Users.query.filter_by(username=form.username.data).first() 
... 
if user is not None: 
    error("user already found")