Историческая модель не позволяет удалять данные при возврате миграции данных django
У меня две модели
class A(models.Model):
index = models.SmallIntegerField(primary_key=True)
audio = models.FileField(null=True, blank=True)
x = models.SmallIntegerField()
y = models.SmallIntegerField(null=True, blank=True)
и
class B(models.Model):
b = models.ForeignKey(B, on_delete=models.CASCADE)
index = models.SmallIntegerField()
audio = models.FileField(null=True, blank=True)
image = models.FileField(null=True, blank=True)
Я сделал миграцию данных, которая инициализирует объекты модели A (каждый объект также создает объекты B, а каждый созданный B также создает объекты C). Вот миграция:
from django.db import migrations
def create_as(apps, schema_editor):
A = apps.get_model('super_app', 'A')
B = apps.get_model('super_app', 'B')
C = apps.get_model('super_app', 'C') # C has FK referencing B
# Some logic here that creates instances of A (also creates B and C)
def delete_as(apps, schema_editor):
A = apps.get_model('super_app', 'A')
A.objects.all().delete()
class Migration(migrations.Migration):
dependencies = [
('super_app', '00xx_the_very_previous_migration'),
]
operations = [
migrations.RunPython(create_as, delete_as)
]
Миграция успешно применяется вперед... но когда я пытаюсь вернуть миграцию назад (которая должна вызывать delete_as
), я всегда получаю эту ошибку:
ValueError: Cannot query "B object (757)": Must be "B" instance.
Я пробовал и копал, но не знаю, почему это происходит!
Примечание: Тип моделей в миграциях - исторические модели (__fake__.{MODEL}
) Я попытался использовать последнее состояние модели, сделав:
def delete_as(apps, schema_editor):
A = apps.get_model('super_app', 'A')
from django.apps import apps # FIXME. This gives latest models state.
B = apps.get_model('super_app', 'B')
B.objects.all().delete()
A.objects.all().delete()
И это сработало без проблем, и я смог вернуть миграцию!!! Но, согласно документации Django, это не должно использоваться.
Есть идеи, почему это происходит?