Здравствуйте.
Есть модели
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, но хотелось бы знать, в чем проблема.