多表继承和两个多对多通过模型在admin内联不工作



我正在尝试创建导航菜单从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'

Page和Category可以是不同类型的菜单项,所以,我使用了继承。现在我想将MenuItem绑定到Menu,因此我在下面添加了两个模型。

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)

我需要菜单项的父键从父键遍历菜单项到子键,并按顺序对菜单进行排序。

在admin中我有两个简单的类:

class MenuLevelInline(admin.TabularInline):
model = MenuLevel
@admin.register(Menu)
class MenuAdmin(admin.ModelAdmin):
inlines = [MenuLevelInline]

问题是:如果我尝试保存两种类型,一种是作为父母保存另一种,事情就会很好。然而,如果我有一个类别作为父类,Page作为子类,我得到IntegrityError: FOREIGN KEY constraint failed错误。

当我查看数据库时,menu_item表确实包含Categories和pages表的所有键。

我做错了什么?

一切只是工作一旦我切换到MySQL。它不能在Sqlite上工作。我不知道为什么它不能与sqlite一起工作,也许这是一个bug。但是改变数据库解决了我的问题。

最新更新