【问题标题】:django access another model through foreign keydjango 通过外键访问另一个模型
【发布时间】:2015-02-09 04:47:50
【问题描述】:

假设我有模型:

Class Author(models.Model):
    id = models.PositiveIntegerField()
    dob = models.DateField() 

Class Note(models.Model):
    note = models.TextField()
    author = models.ForeignKey(Author)

Class Book(models.Model):
    name = models.CharField()
    pubdate = models.DateField()
    author = models.ForeignKey(Author)

在 admin.py 中:

Class BookInline(admin.StackedInline):
    model = Book

Class NoteInline(admin.StackedInline):
    model = Note

Class AuthorAdmin(admin.ModelAdmin):
    model = Author
    inlines = [BookInline, NoteInline]

Class BookAdmin(admin.ModelAdmin):
    model = Book

用户需要从 AuthorAdmin 页面输入数据,并且有一个用于输入图书数据的内联。

理想情况下,我希望注释文本字段成为 Book 模型的一部分,但大多数时候不太可能使用它。

所以我想为了数据库效率,我会把它移到一个单独的表中。在没有正常工作的嵌套内联的情况下(我尝试了现有的包并遇到了已知的错误),上面的设置可以工作(即,将注释附加到作者而不是书)。

但是,当我使用 BookAdmin 时,我看不到任何注释(因为它是 Author 的外键,而不是 Book)。有没有办法编辑给定书籍记录中与作者相关的任何注释?

更新

基于下面的 cmets,我在 Note 中添加了以下外键:
Class Note(models.Model): note = models.TextField() author = models.ForeignKey(Author) book = models.ForeignKey(Book)

然后
Class BookAdmin(admin.ModelAdmin): model = Book inlines = [NoteInline]

这允许我从 BookAdmin 中访问查看注释字段。

但是,当我从 AuthorAdmin 输入笔记时,而不是在 BookAdmin 中显示该笔记时,会显示一个新的空白笔记字段。

我做错了什么?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    我认为Books和Notes之间是否存在关系。它应该在域模型中表示。如果笔记总是有书籍,那么它们应该与书籍而不是作者有关系。

    文档建议使用Generic Relations as an inline,但这将是一种可笑的限制和迂回方法。

    【讨论】:

    • 书籍不会总是有笔记,事实上我猜最多只有 10% 的书籍会有笔记。这就是为什么我想把它们移到一个单独的表中,而不是有很多空的TextFields...注释确实与书籍相关,但将它们与作者相关(例如书评)确实有意义。有没有另一种方法可以让它们与书籍相关,并且仍然有我上面讨论的内联?
    • @mcrsam 笔记总是有相关的书吗?或者作者是唯一的保证关系?为了简单起见,我只需将 Book 中的 FK 添加到您的 Note 模型中。然后您的 BookAdmin 将只使用 NoteInline。如果需要,这种关系甚至可以是可选的。
    • 理想情况下,笔记应该总是有相关的书(例如,笔记是书评。因为我不能嵌套内联,所以将笔记与作者相关联也可以)。我尝试将 FK 从 Book 添加到 Note,但 BookAdmin NoteInline 显示一个新的便笺字段而不是现有的便笺条目(max_num 设置为 1)
    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 2013-06-12
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多