Flask -Admin: почему QuerySelectField не работает в пользовательском представлении редактирования? - PullRequest
0 голосов
/ 25 февраля 2020

У меня следующая проблема: в стеке Flask, Sqlalchemy, Flask -Admin создал следующие модели:

class Store(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    address = db.Column(db.String(200))

    users = db.relationship('User', backref='store', lazy='dynamic')

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    store_id = db.Column(db.Integer, db.ForeignKey('store.id'))
    name = db.Column(db.String(128))
    login = db.Column(db.String(20))
    password = db.Column(db.String(20))

Я использую следующие формы и представления:

class UserForm(FlaskForm):
    store_id = QuerySelectField('Склад', query_factory=lambda: Store.query)
    name = StringField('Name')
    login = StringField('Login')
    password = StringField('Password')

class AdminSet(AdminModelView):
    def edit_form(self, obj=None):
        form = UserForm(obj=obj)
        return form

Представление работает без проблем, но когда я пытаюсь сохранить изменения, появляется следующая ошибка:

Failed to update record. (psycopg2.ProgrammingError) can't adapt type 'Store' [SQL: UPDATE "user" SET    store_id=%(store_id)s WHERE "user".id = %(user_id)s] [parameters: {'store_id': <Store 2>, 'user_id': 2}] (Background on this error at: http://sqlalche.me/e/f405)

Почему это происходит и что я делаю неправильно?

1 Ответ

0 голосов
/ 26 февраля 2020

Из документации WTForms :

"На самом деле свойство data будет хранить / сохранять экземпляр модели ORM, а не идентификатор."

Измените определение формы на следующее:

class UserForm(FlaskForm):
    store = QuerySelectField('Склад', query_factory=lambda: Store.query)
    name = StringField('Name')
    login = StringField('Login')
    password = StringField('Password')
...