1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-baserow

Клонировать/Скачать
field-converter.md 4.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 26.06.2025 16:02 92285f5

Конвертер поля

Конвертер поля может изменять схему базы данных поля и преобразовывать связанные данные в новый формат. Например, в Django невозможно изменить поле ManyToManyField на CharField или конвертировать его в ManyToManyField и обратно. Функция alter_field редактора схемы не будет работать в этом случае. Если вы хотите выполнить конвертацию, вам нужно создать новое поле и удалить старое вместо изменения. Это то, что вы делаете с помощью конвертера поля.

Как это работает

Когда тип поля изменяется или изменяется свойство поля, Baserow проверяет, есть ли применимый конвертер. Для этого он перебирает зарегистрированные конвертеры полей, вызывает метод is_applicable, который определяет на основе экземпляров полей from и to, можно ли применить конвертер в данной ситуации. Если найден применимый конвертер, он будет использован. Возможно, что применимы несколько конвертеров, но будет использован первый, который можно применить. Если нет применимых конвертеров, будет использован метод alter_field редактора схемы с обычной корректностью.

Пример

В приведенном ниже примере мы проверим, является ли from_field текстовым полем, а to_field — полем даты. Если это так, мы сначала хотим удалить старое поле, а затем создать новое поле вместо использования метода alter_field редактора схемы с обычной корректностью. Конечно, это не имеет смысла в реальной жизни, но это просто демонстрация того, как может работать конвертер. Вы можете проявить большую креативность в методе alter_field вашего конвертера. Например, вы можете сначала загрузить все старые значения в память перед удалением поля и затем обновить их снова после добавления нового поля. Вы также можете сначала создать новое поле, выполнить запрос, который обновляет данные поля на основе старого поля, а затем удалить старое поле и переименовать новое поле. Многое возможно. Мы рекомендуем учитывать производительность. Спросите себя: останется ли это быстрым при 100k строк?

plugins/my_baserow_plugin/backend/src/my_baserow_plugin/field_converters.py

from baserow.contrib.database.fields.field_types import (
    TextFieldType, DateFieldType
)
from baserow.contrib.database.fields.registries import FieldConverter


class TextToDateFieldConverter(FieldConverter):
    type = 'text-to-date'

    def is_applicable(self, from_model, from_field, to_field):
        return (
                isinstance(from_field, TextFieldType) and
                isinstance(to_field, DateFieldType)
        )

    def alter_field(self, from_field, to_field, from_model, to_model,
                    from_model_field, to_model_field, user, connection):
        with safe_django_schema_editor() as schema_editor:
            schema_editor.remove_field(from_model, from_model_field)
            schema_editor.add_field(to_model, to_model_field)

plugins/my_baserow_plugin/backend/src/my_baserow_plugin/config.py

from django.apps import AppConfig

from baserow.contrib.database.fields.registries import field_converter_registry


class PluginNameConfig(AppConfig):
    name = 'my_baserow_plugin'

    def ready(self):
        from .field_converters import TextToDateFieldConverter

        field_converter_registry.register(TextToDateFieldConverter())

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-baserow.git
git@api.gitlife.ru:oschina-mirror/mirrors-baserow.git
oschina-mirror
mirrors-baserow
mirrors-baserow
develop