Проблема в вашем понимании списка, который строит значения для поля выбора и разницу между отображением атрибутов столбца в классе против экземпляра класса:
school_choices = [(School.id, School.name) for school in School.query.all()]
В приведенном выше понимании, вкаждый цикл school
(нижний регистр 's') является экземпляром класса School
(верхний регистр 'S').
В sqlalchemy - строковое представление атрибута столбца в классе (не экземпляркласс) возвращает идентификатор базы данных столбца, например: "<tablename>.<columnname>"
или в этом случае "school.name"
. Так создаются запросы, например, попробуйте запустить print(School.__table__.select())
, он выведет SELECT school.id, school.name FROM School
. Идентификация столбцов в этом запросе происходит от «строкового преобразования» экземпляра Column.
Однако, когда мы получаем доступ к атрибуту столбца в экземпляре класса, например, school = School(name="myschool")
, мы получаем значение столбца, который являетсяхранится в базе данных. Например, print(school.school) # myschool
.
Глядя на свое понимание списка выше, вы создаете кортеж (School.id, School.name)
для каждого экземпляра school
в базе данных. Обратите внимание на заглавную букву 'S' для 'School', что означает, что вы в конечном итоге будете отображать строковое представление идентификатора базы данных вашего столбца для каждой школы в базе данных при визуализации вашего шаблона. Ответ так же прост, как изменение вашего понимания на:
school_choices = [(school.id, school.name) for school in School.query.all()]
... но понимание различия довольно важно при использовании sqlalchemy и python в целом.