Конвертер поля может изменять схему базы данных поля и преобразовывать связанные данные в новый формат. Например, в 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 )