Почему я не могу удалить пользовательскую функцию в миграции django models?

Я создал пользовательскую функцию для использования в другом классе

models.py

class DateRangeFunc(models.Func):
    function = "daterange"
    output_field = DateRangeField()

class Foo(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=256)
    start_datetime = models.DateField()
    end_datetime = models.DateField()

    class Meta:
        constraints = [
            ExclusionConstraint(
                name="exclude_overlapping",
                expressions=(
                    (
                        DateRangeFunc(
                            "start_datetime", "end_datetime", RangeBoundary()
                        ),
                        RangeOperators.OVERLAPS,
                    ),

                ),
            ),
        ]

DateRangeFunc - это пользовательский метод, который я создал, чтобы помочь написать ограничение исключения.

Я хочу удалить модель Foo, а также класс DateRangeFunc, потому что оба больше не используются.

Когда я пытаюсь makemigrations после удаления обоих из models.py, я получаю следующую ошибку:

File "foo/migrations/0012_auto_20220907_1238.py", line 31, in Migration
    constraint=django.contrib.postgres.constraints.ExclusionConstraint(expressions=((foo.models.DateRangeFunc('start_datetime', 'end_datetime', django.contrib.postgres.fields.ranges.RangeBoundary()), '&&')), name='exclude_overlapping'),
AttributeError: module 'foo.models' has no attribute 'DateRangeFunc'

потому что он все еще присутствует в старом файле миграции 0012_auto_20220907_1238.py

https://docs.djangoproject.com/en/4.1/topics/migrations/#considerations-when-removing-model-fields

Я должен иметь возможность добавить system_check_removed_details при необходимости (в моем случае это не так), а затем раздавить -> удалить модели -> удалить файл миграции. т.е.

"Сохраняйте это поле-заглушку до тех пор, пока существуют все миграции, которые ссылаются на это поле. Например, после сминания миграций и удаления старых, вы должны иметь возможность полностью удалить поле."

Однако я не могу запустить сквош, потому что возникает та же ошибка. Похоже, что этот класс не может быть удален так же, как другие классы (модели). Аналогичный пост SO: Удаление неиспользуемых функций из моделей Django. Ошибка миграции

объясняет, что я хочу иметь возможность сделать, но, похоже, нет рабочего ответа (я попробовал предложения в комментариях)

Мой вопрос заключается в том, почему я не могу удалить функцию, как я могу удалить модель, и если могу, то как?

попробуйте удалить все связанные миграции, а затем выполните команды makemigrations и migrate.

Вернуться на верх