我正在尝试设计我的第一个数据库并且有点卡住了。设计如下:你有一个可以有很多书的作者。每本书都可以有很多页面。每个页面可以有很多图片。每个页面都是唯一的(ForeignKey
)。图片可能不是唯一的(您可以在不同的页面/书籍中使用相同的图片,因此这应该是ManyToMany
)。 我的问题是,在使用ManyToManyField
时,我无法将照片设为Inlines
。
如果我将ForeignKey更改为ManyToMany,我会得到异常“<class 'books.models.Picture'> has no ForeignKey to <class 'books.models.Page'>
”。我看了here和here,但不知道如何在我的情况下应用这个。
这就是我的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,
]
答案 0 :(得分:3)
您无法直接将ManyToManyFields
用作内联。内联必须有一个外键回到正在编辑的模型,当然实际的孩子不会。如果你想内联编辑M2M,你可以做的最好的就是使用through
表,所以你需要改变你的InlineModelAdmin
,如下所示:
class PictureInline(admin.TabularInline):
model = Page.pictures.through
这要求ManyToManyField
模型上的Page
:
class Page(models.Model):
...
pictures = models.ManyToManyField(Picture)
答案 1 :(得分:0)
根据https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-models中的文档,您必须在内联中定义model
属性