Изменение пользовательского поля 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):
    ...
Вернуться на верх