@KTF

Почему возникает ошибка несовпадения типов при создании объектов в обратной миграции?

Здравствуйте.
Есть модели LanguageVariable и Page c Many-To-One связью:
class Page(models.Model):
    code = models.CharField(max_length=20)
    title = models.CharField(max_length=255, blank=True, default='', help_text='Page title displayed on a browser panel.')
    site = models.ForeignKey(Site, on_delete=models.PROTECT)
    objects = ModelManager()

    class Meta:
        unique_together = ('site', 'code')

    def __str__(self):
        return self.code

class LanguageVariable(models.Model):
    name = models.CharField(max_length=100)
    value = models.TextField(max_length=1000)
    page = models.ForeignKey(Page, related_name='lang_vars', on_delete=models.PROTECT)

    class Meta:
        db_table = 'cms_language_variable'
        unique_together = ('name', 'page')

    def __str__(self):
        return self.name

При миграции необходимо удалить старые языковые переменные для домашних страниц (их несколько по кол-ву языков на сайте). Соответственно, в коде обратной миграции эти переменные добавляются. Примерный код:
test = {
    'test1': 'test1',
    'test2': 'test2',
}

def change_page(apps, schema_editor):
    LanguageVariable = apps.get_model('cms', 'LanguageVariable')
    LanguageVariable.objects.filter(name__in=test.keys(), page__code=PAGE_HOME).delete()

def revert_change_page(apps, schema_editor):
    Page = apps.get_model('cms', 'Page')
    LanguageVariable = apps.get_model('cms', 'LanguageVariable')

    home_pages = Page.objects.filter(code=PAGE_HOME)

    for page in home_pages:
        for lang_var_name, lang_var_value in test.items():
            lang_var = LanguageVariable()
            lang_var.name = lang_var_name
            lang_var.value = lang_var_value
            lang_var.page = page
            lang_var.save()

При откате миграции получаю следующую ошибку:
ValueError: Cannot assign "": "LanguageVariable.page" must be a "Page" instance.

При итерации page имеет тип class __fake__.Page и поначалу можно подумать, что проблема в этом, однако если этот же код добавить в прямую миграцию, ошибки не будет, но тип будет тот же.

Ошибка возникает в django/db/models/fields/related_descriptors.py:
if value is not None and not isinstance(value, self.field.remote_field.model._meta.concrete_model):

По какой-то неведомой причине isinstance возвращает False при обратной миграции, хотя типы одинаковы. Не могу понять, в чем может быть дело. Ошибка возникала на Django 2.1, обновление до последней версии ничего не изменило.
Пока в качестве решения использовал указание страницы по ключу: lang_var.page_id = page.id, но хотелось бы знать, в чем проблема.
  • Вопрос задан
  • 50 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы