gpt4 book ai didi

database - Django 数据库设计 : ManyToManyField when using Inlines

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:32 24 4
gpt4 key购买 nike

我正在尝试设计我的第一个数据库,但遇到了一点困难。设计如下:你有一个作者可以有很多本书。每本书可以有很多页。每个页面可以有很多图片。每个页面都是唯一的 ( 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,
]

最佳答案

您不能将 ManyToManyFields 直接用作内联。内联必须有一个返回正在编辑的模型的外键,当然实际的 child 没有。如果你想编辑一个 M2M 内联,你能做的最好的就是使用 through 表,所以你需要像这样改变你的 InlineModelAdmin:

class PictureInline(admin.TabularInline):
model = Page.pictures.through

这要求 ManyToManyFieldPage 模型上:

class Page(models.Model):
...
pictures = models.ManyToManyField(Picture)

关于database - Django 数据库设计 : ManyToManyField when using Inlines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8895474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com