По умолчанию, когда валидатор IS_IN_DB
генерирует набор значений и связанных меток, он не сортируется напрямую по сгенерированным меткам. Скорее, в выборе базы данных он определяет предложение ORDER BY
, которое включает поля, используемые для создания метки. Если атрибут format
указанной таблицы является строкой формата Python, поля меток извлекаются из этой строки формата в порядке их появления. В этом случае это приводит к упорядочению окончательного набора по меткам.
Однако, если атрибут format
ссылочной таблицы является функцией, IS_IN_DB
не знает, какие поля необходимы для создания меток, поэтому он просто выбирает все поля в таблице и упорядочивает все поля (в порядок их появления в определении таблицы). В этом случае, поскольку db.bank_branch.id
является первым полем в определении таблицы (хотя оно явно не определено), это первое поле в предложении ORDER BY
, в результате чего параметры упорядочиваются по идентификаторам таблицы db.bank_branch
. .
Если вы хотите принудительно отсортировать параметры по сгенерированным меткам, вы можете использовать аргумент sort
:
IS_IN_DB(db, 'bank_branch.id', db.bank_branch._format, sort=True)
Кроме того, имейте в виду, что если имеется много отделений банка, этот метод создания меток несколько неэффективен, поскольку функция format
включает рекурсивный выбор (т. Е. r.bank.brank_code
), который выполняет отдельный выбор. для каждого элемента в списке. Альтернативой может быть создание собственного набора значений и меток на основе запроса на соединение, а затем использование валидатора IS_IN_SET
(или использование IS_IN_DB
только для проверки и указание виджета формы и его параметров отдельно). Конечно, в какой-то момент может быть больше ветвей, чем было бы разумно включить в выборочный ввод, и в этом случае вы можете использовать IS_IN_DB
для проверки, но следует использовать альтернативный виджет ввода (например, автозаполнение Ajax ).