Наследование нескольких таблиц и два многие ко многим через модель не работают в админке 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, возможно, это ошибка. Но смена базы данных решила мою проблему.

Вернуться на верх