2017-01-30 24 views
1

我目前正試圖在模型中實現Django中的書結構。Django中的書結構

的結構如下

Book類:

標題

頁(這是頁對象的數組)

書目(標題和鏈路的字典)

Page Class:

標題

部分(部分對象的數組)

圖像(圖像URL的陣列)

科類別:

標題:

文本:

圖像(圖像URL的陣列)

視頻(視頻網址的陣列)

我非常新的Django和SQL結構。我的問題具體是什麼,爲了創建一個帶有上面列出的組件的書籍的數據庫,最好的方法是什麼?我知道最好的方法是製作一張書籍表,其中每個條目與頁面有一對多的關係,而頁面又與段落有一對多的關係。但我不清楚將Django模型連接在一起以及如何啓用對象列表(重要的是這些列表必須是動態的)。

+0

一個頁面是否可以出現在多本書中?似乎不太可能。同樣,一個部分是否可以出現在多個頁面中? – ChidG

+0

你有這些錯誤的方式:頁面應該屬於一本書。這與教程中的問題和選擇完全相同,您應該閱讀。 –

回答

1

SQL沒有「數組」的概念 - 表中的每個字段都是原子的(包含單個值) - 所以如果你想要一個實體A「擁有」許多(「數組」)另一個實體B你需要(至少)兩個表(一個用於A,另一個用於B)以及這些表之間的關係。在這裏你可以有兩種關係:「一對多」和「多對多」。

如果B一個實例只能屬於A一個實例 - 例如像在Book - 你的情況>Page關係,其中一個Page屬於一個Book(明顯),你有一個「一對(一個Book有一個或多個PagePage屬於一個單一的Book)。在數據庫級,這通過0​​表具有指向它所屬的book的主鍵的外鍵字段來實現。在Django模型中,這是使用models.ForeignKey() field完成的。

如果A實例有很多BB一個實例可以屬於多個A,你有一個多對多的關係。這可能是Book - >Author關係的情況(Author寫入一個或多個Book,而Book由一個或多個Author寫入。在數據庫級別,這是通過附加表實現的,該表將具有外鍵(通常是「唯一」的兩個鍵的約束,所以你不會將同一個作者關聯到同一本書)在Django中,這是通過使用models.ManyToManyField來完成的該Book或。(注:獨家「或」)Author模型,Django會自行創建中間表

因此,對於你的榜樣,你將需要:

  • 「書籍」的模式
  • 一個「BibliographyItem」模式
  • 「頁」模式與「周易」中的外鍵
  • 一個「科」模型與「頁面」
  • 外鍵
  • 「圖像」模式
  • 「視頻」模式

根據您是否希望能夠分享書籍之間或不相同BibliographyItem,你要麼需要一個多對多字段或ForeignKey在「Book。在這種情況下(並且不知道更多關於您項目的要求),我寧願去尋求一種ManyToMany關係(很可能有多本書會引用同一個項目)。

同樣的事情爲ImageVideo,你可以選擇分段或不分段。

我強烈建議您閱讀關於關係數據庫建模和關係模型規範化的更多內容(並完成一些教程),以瞭解核心概念以及如何正確設計模型。 Django的ORM只是數據庫表和字段的一個簡單包裝,因此如果您希望做任何事情,您都需要了解數據庫級別的情況。

+0

這非常有幫助。非常感謝。 – Peter

+0

我認爲這將是類/項目之間的單獨表格,但我不熟悉Django的某些內置功能。 – Peter

+0

作爲跟進,如果我想實現與教科書有關的頁碼,除了桌面上的ID條目,你會怎麼做呢? – Peter

-1

每個Django模型都是您在應用中導入的類,以便能夠使用它們。要將模型連接在一起,您可以使用外鍵來定義關係,即您的Page類將具有來自Book的外鍵。要將列表存儲在字段中,其中一種方法是使用json模塊將列表轉換爲字符串,並將該字段定義爲文本字段。 json.dumps將列表轉換爲字符串,json.loads將字符串轉換回列表。或者,如果您在提問中正在討論其他「列表」,那麼您可能只需要使用model.objects.get()獲得的django的基本查詢集。 Queryset是表格中的行的列表。