Изменение пользовательского поля Django не обнаруживается миграциями
У меня есть несколько пользовательских полей в Django. Сначала они расширили PositiveSmallIntegerField, так как мы использовали варианты int, например:
class BusinessLegalFormField(models.PositiveSmallIntegerField):
choices = [(1,'SRO'), (2, ....]
def __init__(self, *args, **kwargs):
if not args or not args[0]:
kwargs.setdefault('verbose_name', 'Právna forma')
kwargs['choices'] = self.choices
super().__init__(*args, **kwargs)
Затем я изменил его на CharField и TextChoices:
class BusinessLegalFormField(models.CharField):
class Choices(models.TextChoices):
ZIVNOST = 'zivnost', 'Živnosť'
SRO = 'sro', 'Spoločnosť s ručením obmedzeným'
AS = 'as', 'Akciová spoločnosť'
def __init__(self, *args, **kwargs):
if not args or not args[0]:
kwargs.setdefault('verbose_name', 'Právna forma')
kwargs.setdefault('max_length', 64)
kwargs['choices'] = self.Choices.choices
super().__init__(*args, **kwargs)
Проблема в том, что я только что понял, что Django не обнаружил изменение типа. Когда я меняю что-то вроде null=True на null=False, это обнаруживается, но тип БД не меняется с числа на char.
Как я могу заставить его работать?
Эта самая ситуация и решение для нее описаны в документации:
Вы не можете изменить базовый класс пользовательского поля, потому что Django не обнаружит изменения и не сделает миграцию для него... Вы должны создать новый класс пользовательского поля и обновить ваши модели, чтобы они ссылались на него.
class CustomCharField(models.CharField): ... class CustomTextField(models.TextField): ...