2015-02-09 58 views
0

另一個模型假設我有型號:Django的訪問通過外鍵

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模型的一部分,但大部分時間不太可能使用。

所以我認爲爲了提高數據庫效率,我把它移到了一個單獨的表格中。如果沒有正確工作的嵌套內聯(我嘗試了現有的軟件包並遇到已知的錯誤),上面的設置可以正常工作(即將附註附加到Author而不是Book)。

但是,當我使用BookAdmin時,我看不到任何註釋(因爲它是作者的外鍵,而不是Book)。有沒有辦法在給定的書籍記錄中編輯與作者有關​​的任何筆記?

更新

基於下面的評論,我已經添加了以下外鍵注:
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中顯示此筆記時,會顯示一個新的空白筆記字段。

我在做什麼錯?

回答

0

我想如果書和筆記之間有關係。它應該在域模型中表示。如果筆記總是有書,那麼它們應該與書籍而不是作者有關係。

該文檔建議使用generic relations as an inline,但這將是一個荒謬的限制和圓的方法。

+0

書並不總是有筆記,事實上我猜測只有一個筆記,或許10%的所有書最好。這就是爲什麼我想將它們移動到一個單獨的表格中,而不是有很多空的TextFields ...... Notes與書籍確實有關,但它們與作者相關(例如書評)是有意義的。是否有另一種方式讓他們與書籍相關,並且仍然有上面討論的我的內聯? – mcrsam 2015-02-09 05:27:58

+0

@mcrsam做筆記總是有一本相關的書?或者是作者唯一的保證關係?爲了保持簡單,我只需在Book中添加一個FK到你的筆記模型。然後,您的BookAdmin只會使用NoteInline。如果需要,關係甚至可以是可選的。 – 2015-02-09 17:05:08

+0

理想情況下,筆記應該總是有一本相關的書(例如,筆記是一本書評論。因爲我不能嵌套內聯,所以筆記與作者相關也可以)。我嘗試從Book to Note中添加FK,但是隨後BookAdmin NoteInline顯示一個新的note字段,而不是現有的note條目(max_num設置爲1) – mcrsam 2015-02-10 10:39:26