LINUX.ORG.RU

SQLAlchemy теряет атрибуты String при сохранении

 , , ,


0

3

Всем привет! У меня маленький опыт программирования на Flask, поэтому вопрос задам, возможно, глупый, но самостоятельно найти решение не смог. Столкнулся с непонятным поведением SQLalchemy. Исходные данные:

db = SQLAlchemy(app)
class User(db.Model):
    password = db.Column(db.String(255))
    # password = db.Column(db.Integer())
...
 
def user_update(user_id):
    user_form = model_form(User, Form)
    user = models.User.query.get(user_id)
    form = user_form(request.form, user)
    if request.method == 'POST':
        form.populate_obj(user)
        db.session.commit()
        return redirect(url_for('user_view', user_id=user.id))
    return render_template('user_detail.html', form=form, user=user)

(Копия тут)

На форме WTF атрибут password не передаётся.

Суть вопроса: при сохранении модели атрибут password сбрасывается до " если он текстовый (db.Text/db.String) и остаётся неизменным, если отличен от текстового (db.Integer/db.DateTime). Т.е. если форма не передала значения текстовых атрибутов — значения будут переписаны пустой строкой (при default=NULL). Если обновлять ручками через shell — всё нормально. Как пофиксить?

P.S. Задал вопрос на python@conference.jabber.ru, но там молчат.


У меня маленький опыт программирования на Flask, поэтому вопрос задам по SQLalchemy.

ок

shty ★★★★★ ()
Ответ на: комментарий от ggrn

а есть ли password в request.form ?

Опытным путём установил, что значение атрибута теряется после form.populate_obj(user). Итерация form показала, что несмотря на то, что на форме поля password не было, он был в request.form и его значение было ". Атрибуты других типов, также отсутствующие на форме, были возвращены в request.form с исходными значениями.

ivn86 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.