Django数据库设计:使用Inlines时的ManyToManyField

时间:2012-01-17 13:31:38

标签: database django postgresql django-models django-admin

我正在尝试设计我的第一个数据库并且有点卡住了。设计如下:你有一个可以有很多书的作者。每本书都可以有很多页面。每个页面可以有很多图片。每个页面都是唯一的(ForeignKey)。图片可能不是唯一的(您可以在不同的页面/书籍中使用相同的图片,因此这应该是ManyToMany)。 我的问题是,在使用ManyToManyField时,我无法将照片设为Inlines

如果我将ForeignKey更改为ManyToMany,我会得到异常“<class 'books.models.Picture'> has no ForeignKey to <class 'books.models.Page'>”。我看了herehere,但不知道如何在我的情况下应用这个。

这就是我的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,
        ]

2 个答案:

答案 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属性