Database Django数据库设计:使用内联线时的ManyToManyField
我正试图设计我的第一个数据库,但有点卡住了。设计如下:你有一个作家,他可以有很多书。每本书可以有很多页。每页可以有许多图片。每个页面都是唯一的(Database Django数据库设计:使用内联线时的ManyToManyField,database,django,postgresql,django-models,django-admin,Database,Django,Postgresql,Django Models,Django Admin,我正试图设计我的第一个数据库,但有点卡住了。设计如下:你有一个作家,他可以有很多书。每本书可以有很多页。每页可以有许多图片。每个页面都是唯一的(ForeignKey)。图片可能不是唯一的(您可以在不同的页面/书籍中使用相同的图片,因此这应该是manytomy)我的问题是,在使用内联线时,我无法将图片设置为ManyToManyField 如果我将ForeignKey更改为ManyToMany,则会出现异常“没有ForeignKey to”。我看了一下,但不知道如何将其应用到我的案例中 这就是my
ForeignKey
)。图片可能不是唯一的(您可以在不同的页面/书籍中使用相同的图片,因此这应该是manytomy
)我的问题是,在使用内联线时,我无法将图片设置为ManyToManyField
如果我将ForeignKey更改为ManyToMany,则会出现异常“没有ForeignKey to
”。我看了一下,但不知道如何将其应用到我的案例中
这就是my models.py的外观:
class Author(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField()
class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=50)
class Page(models.Model):
book = models.ForeignKey(Book)
contents = models.TextField(max_length=15999)
class Picture(models.Model):
page = models.ForeignKey(Page) # ideally, this should be many-to-many
picture_uuid = models.CharField(max_length=36)
在我的管理界面中,我希望将作者写的所有书籍都放在作者页面上。另外,我想把一本书的所有页面都放在图书页面中,以此类推。因此,我的admin.py如下所示:
class PictureAdmin(admin.ModelAdmin):
list_display = ('id', 'picture_uuid')
class PictureInline(admin.TabularInline):
model = Picture
class PageAdmin(admin.ModelAdmin):
list_display = ('id', 'page_uuid')
inlines = [
PictureInline,
]
class PageInline(admin.TabularInline):
model = Page
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'title')
inlines = [
PageInline,
]
class BookInline(admin.TabularInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'email')
inlines = [
BookInline,
]
不能将ManyToManyFields
直接用作内联线。内联线必须有一个外键返回到正在编辑的模型,当然,实际的子对象没有。如果要编辑M2M内联,最好通过
表使用,因此需要更改InlineModelAdmin
,如下所示:
class PictureInline(admin.TabularInline):
model = Page.pictures.through
这要求ManyToManyField
位于页面上
型号:
class Page(models.Model):
...
pictures = models.ManyToManyField(Picture)
根据中的文档,您必须在内联中定义model
属性。。。是的。而且,这也不是问题所在。@ChrisPratt如果你看到我指向你的链接,你会注意到我的答案和你的答案几乎一样,当我说定义一个模型时,我的意思是Model=Page.pictures。为什么要发布一个只提示与我的答案相同的答案呢?当我回答这个问题时,我的页面没有刷新:)效果很好,除了我现在有两个部分在一个页面上,我可以选择图片。一个外键下拉菜单选择图片,一个普通多对多菜单选择图片。如何去掉第二个?只需将实际字段添加到您的ModelAdmin
的excludes
中,一般来说,不,您不会将同一关系添加到同一个模型两次。我以前从来没有想过要这样做,因为我从来没有这样的需要。Django为M2M关系创建的默认中间表可能会在两个外键上强制执行唯一的“一起”约束。你可以通过创建你自己的模型来解决这个问题。你必须在你的内联类中添加原始id\u字段InlineModelAdmin
s(在大多数情况下)在功能上与常规ModelAdmin
s完全相同。像字段集、排除项等在InlineModelAdmin
上定义,就像在ModelAdmin
上一样。这是因为到模型上的字段不是“图片”,而是图片
。