Почему я не могу удалить пользовательскую функцию в миграции 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.