Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Django数据库设计:使用内联线时的ManyToManyField_Database_Django_Postgresql_Django Models_Django Admin - Fatal编程技术网

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
上一样。这是因为
模型上的字段不是“图片”,而是
图片