Наследование нескольких таблиц и два многие ко многим через модель не работают в админке inline
Я пытаюсь создать навигационное меню из админки django в соответствии с требованиями пользователя. Модель выглядит следующим образом:
class MenuItem(models.Model):
title = models.CharField(max_length=200, help_text='Title of the item')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=False)
def __str__(self):
return self.title
class Page(MenuItem):
"""
To display non-hierarchical pages such as about us, or some page in menu
"""
slug = models.SlugField(max_length=200, unique=True, help_text='End of url')
content = HTMLField(help_text='Contents of the page')
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
class Category(MenuItem):
"""
For hierarchical display eg. in navigation menu use Category and Articles.
"""
slug = models.SlugField(max_length=200, unique=True, help_text='End of url')
class Meta:
verbose_name_plural = 'categories'
Страница и Категория могут быть разными типами пунктов меню, поэтому я использовал наследование. Теперь я хочу привязать MenuItem к меню, поэтому я добавил еще две модели ниже.
class Menu(models.Model):
title = models.CharField(max_length=200, unique=True, help_text='Name of the menu.')
is_published = models.BooleanField(default=False)
item = models.ManyToManyField(MenuItem, through='MenuLevel', through_fields=['menu', 'menu_item'])
def __str__(self):
return self.title
class MenuLevel(models.Model):
menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
menu_item = models.ForeignKey(MenuItem, on_delete=models.CASCADE, related_name='items')
level = models.IntegerField(default=0)
parent = models.ForeignKey(MenuItem, on_delete=models.CASCADE, related_name='parent', null=True, blank=True)
Мне нужна клавиша parent для пункта меню, чтобы перемещаться по пунктам меню от родителя к детям и level для сортировки меню по порядку.
В админке у меня есть два простых класса:
class MenuLevelInline(admin.TabularInline):
model = MenuLevel
@admin.register(Menu)
class MenuAdmin(admin.ModelAdmin):
inlines = [MenuLevelInline]
Вот в чем проблема: Если я пытаюсь сохранить две категории, одну как родительскую для другой, все работает нормально. Однако, если у меня есть категория в качестве родителя и Page в качестве ребенка, я получаю IntegrityError: FOREIGN KEY constraint failed error.
Когда я смотрю в базу данных, таблица menu_item действительно содержит все ключи как для таблицы Categories, так и для таблицы pages.
Что я сделал не так?
Все заработало, как только я перешел на MySQL. На Sqlite это не работало. Я не знаю, почему он не работает с sqlite, возможно, это ошибка. Но смена базы данных решила мою проблему.