#python #flask #sqlalchemy #flask-sqlalchemy #flask-wtforms
#python #flask #sqlalchemy #flask-sqlalchemy #flask-wtforms
Вопрос:
Я пытаюсь добавить результат запроса SQLAlchemy в список.
Мое приложение содержит следующую модель («Game)» и games_query (используется в качестве QuerySelectField query_factory от FlaskForm). РЕДАКТИРОВАТЬ: также добавлена FlaskForm, поскольку кажется, что проблема связана с самой формой, а не с query_factory .
class Game(db.Model):
game_id = db.Column(db.Integer, primary_key=True, nullable=False)
title = db.Column(db.String, nullable=False, unique=True)
records = db.relationship('Record', backref='game')
def games_query():
games_list = []
for g in Game.query:
games_list.append(g.title)
print(g.title)
return games_list
class ScoreForm(FlaskForm):
name = StringField('Name', validators=[InputRequired()])
score = IntegerField('Score', validators=[InputRequired()])
game = QuerySelectField('Game', query_factory=games_query)
submit = SubmitField('Submit')
games_query возвращает следующую ошибку, несмотря на вывод g.title в консоль, возвращающую допустимые значения (названия игр):
Ошибка sqlalchemy.orm.exc.UnmappedInstanceError: класс ‘builtins.str’ не сопоставлен
РЕДАКТИРОВАТЬ: установка query_factory в качестве функции, возвращающей базовые списки, приводит к отображению той же ошибки.
def games_query():
games_list = ["Mario", "Zelda"]
return games_list
Как я могу обойти эту ошибку, чтобы games_query возвращал список названий игр, которые могут быть переданы в качестве опций в поле соответствующей формы?
Комментарии:
1. Обновил начальный пост, поскольку я понял, что ошибка связана с FlaskForm, а не с query_factory .
Ответ №1:
Я нашел причину ошибки. Решение приведено ниже.
Функция query_factory должна возвращать только полный запрос (не список, а не отдельный столбец запроса):
def games_query():
return db.session.query(Game)
Код Jinja, связанный с FlaskForm по умолчанию, будет отображать столбец primary_key, если только не будет установлен конкретный столбец в FlaskForm с помощью атрибута get_label:
class ScoreForm(FlaskForm):
name = StringField('Name', validators=[InputRequired()])
score = IntegerField('Score', validators=[InputRequired()])
game = QuerySelectField('Game', query_factory=games_query, get_label='title')
submit = SubmitField('Submit')
Ответ №2:
def games_query():
games_list = []
for row in Game.query:
games_list.append(row.__dict__['title'])
print(row.__dict__['title'])
return games_list
Попробуйте
Комментарии:
1. Спасибо за помощь, но с вашим решением я получаю точно такое же сообщение об ошибке («Класс ‘builtins.str’ не сопоставлен»).
2. О, у меня тот же код, но выполняется хорошо, проверьте модель и добавьте: tablename = ‘Game’ .