Порядок сортировки web2py в раскрывающемся списке, когда атрибут формата справочной таблицы является функцией - PullRequest
0 голосов
/ 01 ноября 2018

Q & A здесь и здесь , по-видимому, указывают на то, что порядок сортировки по умолчанию в раскрывающемся списке, сделанном валидатором IS_IN_DB, определяется атрибутом формата указанной таблицы. Но в следующем случае порядок сортировки по умолчанию - это id идентифицируемой таблицы:

db.define_table('bank',
            Field('bank_code', 'string',
                  unique=True, required=True, label='Bank/FI Code'),
            Field('bank_name', 'string',
                  required=True, label='Bank/FI Name'),
            singular="Bank", plural="Banks",
            format='%(bank_name)s'
            )

db.bank.bank_code.requires=IS_UPPER()
db.bank.bank_name.requires=IS_UPPER()

db.define_table('bank_branch',
            Field('bank', 'reference bank', label='Bank/FI'),
            Field('branch_name', 'string', required=True, label='Branch Name'),
            format=lambda r:'%s-%s' % (r.bank.bank_code, r.branch_name)

Несмотря на то, что выпадающие метки отображают метки, возвращаемые лямбда-функцией таблицы bank_branch, они сортируются по полю id.

Здесь рекомендуется использовать IS_IN_SET для таких ситуаций, но что может быть объяснением нормального поведения сортировки на основе изменения атрибута 'format', когда такой формат выполняется лямбда-функцией ?

1 Ответ

0 голосов
/ 01 ноября 2018

По умолчанию, когда валидатор 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 ).

...