Интерактивная схема базы данных

Откройте Схема БД в навигации (/admin/schema с учётом вашего mount-префикса).
В схему входят все зарегистрированные таблицы с правами list и view. По умолчанию
выбраны все эти таблицы, в том числе без связей, если их не больше 100. Для большей схемы
изначально ничего не выбрано: отметьте нужные таблицы в панели выбора или нажмите Показать все.
Схема строится по метаданным адаптеров:
открытие и перестановка таблиц не читает и не изменяет значения записей.

Схема БД с панелью выбора таблиц и раскрытой промежуточной таблицей M:N

Схема занимает доступную высоту страницы под шапкой. Более широкая панель выбора
оставляет больше места для подписей и групп; на невысоких экранах её содержимое
прокручивается, сохраняя доступ к схеме. Эта панель относится к рабочей области схемы;
полный каталог для перехода к записям находится в виде Список таблиц на главной.
При наличии более 100 доступных таблиц сначала нужно выбрать их вручную.

Работа со схемой

  • Таблицы открывает панель выбора. Ищите по подписи, имени таблицы или настроенной группе,
    выбирайте видимые таблицы флажками или кнопками Показать все / Скрыть все.
    Поиск сокращает список в панели, не меняя схему. Нажатие на название центрирует таблицу.
  • Флажок группы выбирает или скрывает сразу все её таблицы. Группы соответствуют
    ModelOptions(group="Sales"), как в виде Список таблиц на главной. Промежуточное состояние флажка означает,
    что выбрана часть таблиц; счётчик всегда относится ко всей группе. Поиск скрывает
    неподходящие варианты, но флажок группы по-прежнему меняет все её таблицы, включая
    скрытые поиском. Поиск по названию группы показывает все её таблицы. Таблицы без группы
    и незарегистрированные промежуточные таблицы выбираются отдельно.
  • В свёрнутой карточке видны первичные ключи и поля связей. Нажмите карточку или
    Enter/Пробел на ней, чтобы увидеть остальные доступные поля; повторное нажатие сворачивает её.
  • Наведите указатель на карточку или дайте ей фокус, чтобы увидеть кнопку
    Показать только связанные таблицы. Она оставляет эту таблицу и её прямых соседей
    из текущего выбранного набора. Повторное нажатие возвращает прежние таблицы, позиции
    и масштаб. Активная кнопка остаётся видимой; на сенсорном экране кнопки видны постоянно.
    Кнопка другой карточки переключает просмотр связей в рамках исходного набора.
    Изменение флажков таблиц или групп завершает временный режим и применяет новый выбор.
  • Линии соединяют участвующие поля. Подписи и окончания различают 1:1 · o2o,
    1:N · o2m и N:M · m2m. Выбор таблицы подсвечивает её связи.
  • Нажмите подпись N:M, чтобы показать промежуточную таблицу и две связи 1:N.
    Кнопка сворачивания на любой из этих линий возвращает логическую связь M:N.
    Зарегистрированная промежуточная таблица использует существующую карточку;
    незарегистрированная появляется в панели выбора после раскрытия связи.
  • Перетаскивайте карточки для перестановки, пустое место — для перемещения схемы.
    Колесо прокручивает схему; Ctrl/⌘ + колесо и кнопки +/− меняют масштаб.
    Вся схема показывает все выбранные таблицы; Автокомпоновка также сбрасывает
    ручные позиции. Перемещение любой таблицы фиксирует позиции всех видимых таблиц до
    следующей Автокомпоновки. Автоматическая компоновка учитывает раскрытые карточки
    и отдельные группы таблиц.
  • Развернуть схему использует доступное место окна; Escape возвращает обычный вид.
    На узком экране панель таблиц изначально свёрнута, кроме режима ручного выбора. Открыть таблицу ведёт к списку
    записей выбранной зарегистрированной таблицы.

С клавиатуры стрелки перемещают выбранную карточку (Shift увеличивает шаг),
Enter/Пробел раскрывают поля и промежуточные таблицы. При фокусе на полотне +/− меняют
масштаб, 0 вмещает схему. Выбор, раскрытие и позиции сохраняются до ухода со страницы;
после перезагрузки снова применяется правило начального выбора.

Начальный выбор для больших баз данных

Если зарегистрировано много таблиц, откройте Схема БД, найдите нужные таблицы в
панели выбора и отметьте их. При превышении стандартного порога в 100 доступных таблиц
схема открывается пустой с поясняющим сообщением. Панель выбора остаётся открытой даже
на узком экране. Связи появляются по мере выбора участвующих таблиц.

Настройте это поведение при создании вашей админки с авторизацией:

admin = Admin(
    auth=auth_backend, secret_key=session_secret, adapters=[adapter],
    schema_auto_limit=True,
    schema_table_limit=100,
)

schema_auto_limit по умолчанию равен True; schema_table_limit — положительное целое.
Порог учитывает зарегистрированные таблицы, доступные текущему пользователю после
проверки прав. При ровно 100 таблицах все они по-прежнему выбраны сразу. Настройка влияет
только на начальный выбор: все доступные таблицы остаются в поиске, а Показать все
не ограничивает их количество. Задайте schema_auto_limit=False, чтобы сразу выбирать
все таблицы, или измените schema_table_limit для своей БД. Регистрация, права и операции
с записями не меняются. Полный каталог метаданных всё равно загружается; эти параметры
не ограничивают reflection и объём метаданных, переданных браузеру.

Отображение большого набора таблиц

Показать все и schema_auto_limit=False оставляют на полотне все выбранные таблицы.
Для большого набора работа по построению линий ограничена, а при перетаскивании обновляются
карточка и её связи без пересоздания всех карточек. Перемещение полотна и масштабирование
используют существующую схему. Длинные цепочки внешних ключей не зависят от ограничения
рекурсии браузера.

Автокомпоновка переносит большие вытянутые группы в компактные столбцы и упаковывает
отдельные компоненты с учётом пропорций рабочей области. Тысячи таблиц больше не образуют
длинные разреженные полосы вокруг пустого центра. Размеры карточек по-прежнему учитывают
видимые и раскрытые поля; все выбранные таблицы остаются на схеме. Небольшие схемы сохраняют
слои связей. Вся схема вмещает существующие позиции без перестановки, а Автокомпоновка
сбрасывает ручные позиции и рассчитывает расположение под текущий размер окна.

В плотной схеме линия может пересечь постороннюю карточку, если поиск свободного обхода
занимает слишком много работы. Выберите начало или конец связи, чтобы подсветить её,
либо скройте лишние таблицы в панели. Для небольшого набора сохраняется полноценный поиск
пути в обход карточек.

Адаптер SQL reflection повторно использует метаданные связей текущего снимка схемы.
После миграций вызовите await adapter.refresh() перед перезагрузкой страницы, чтобы
увидеть добавленные или удалённые внешние ключи и изменения уникальности;
см. SQL reflection. Кеш содержит только физические метаданные; права
и видимость полей проверяются заново при каждом запросе схемы.

Права и видимость полей

Нужны авторизация и оба права list и view на каждую таблицу. Связи с недоступными
таблицами и через скрытые поля соединения не показываются. В группы и их счётчики входят
только доступные таблицы; группы без доступных таблиц отсутствуют. Видимость полей определяется
ModelOptions, включая стандартное скрытие полей с учётными данными. Зарегистрированная
промежуточная таблица с ограниченными правами не появляется повторно как техническая карточка.

Незарегистрированная промежуточная таблица показывает только метаданные полей от адаптера,
без полей учётных данных. У неё нет перехода к записям и CRUD. Зарегистрируйте и настройте
её как таблицу, если нужны дополнительные ограничения видимости полей приложения.

Схема использует общие токены темы — см. кастомизацию интерфейса.
Встроенный JavaScript разрешён точным SHA-256 CSP-хешем и SRI только на этой странице.
Политика скриптов собственных страниц не меняется.

Собственные адаптеры

Для обычных линий достаточно существующего RelationAdapter.relations().
Необязательные Relation.source_key_fields и target_key_fields описывают реальные
поля соединения, в том числе альтернативные уникальные ключи. through называет
промежуточную таблицу M:N, junction задаёт её поля и внешние ключи обеих сторон:

from quite_admin import Field, Junction, Relation

Relation(
    name="tags", target=Tag, kind="many_to_many",
    source_key_fields=("id",), target_key_fields=("id",), through="product_tags",
    junction=Junction(
        name="product_tags",
        fields=(
            Field("product_id", int, primary_key=True),
            Field("tag_id", int, primary_key=True),
        ),
        source_fields=("product_id",), target_fields=("tag_id",),
        model=ProductTag,  # необязательно: зарегистрированная модель промежуточной таблицы
    ),
)

Метаданные промежуточной таблицы не требуют первичного ключа. Необязательный sync/async
schema_relations(model) может отдавать сведения только для схемы, не меняя редактируемые
связи. Встроенный адаптер SQLAlchemy также показывает физические FK без ORM relationship().
Версия API адаптера остаётся 1.