2013-04-06 4 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'

Я знаю, что моя логика для получения данных из db неверна. Я мало знаю SQLalchemy.

Не могли бы вы предложить мне, как я могу принести UsernameEmail) значение столбца из таблицы Users, а затем проверить их, если есть такие же, как form.username.data?

+0

Можете ли вы вставить точную ошибку, включая строку, в которой ошибки? – Elrond

ответ

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")