一 前言前端
在上一篇文章需求分析中,已經大體說明了爲何要開發圖書借閱管理系統、系統應該具有哪些角色或行爲、系統如何工做等,對該系統應該有了大體的印象,那接下來的文章就是介紹如何一步步實現。python
本文將介紹開發圖書借閱管理系統的第一步,也是關鍵的一步—模型設計。若是將系統精簡,它符合輸入-》驅動-》輸出的模型,具體而言,系統收到http請求(輸入),對請求進行處理(驅動,即邏輯處理+數據庫操做),而後將處理的結果返回前端(輸出),因此在這個模型裏,重點是驅動部分(Django名詞:視圖)。乍一看,好像是偏題了,明明說的是Django的模型(model),怎麼又扯到視圖(view)了。其實,這裏是想把本就緊密的概念先引入進來,混個眼熟,更重要的是,好的模型設計既能適應將來的功能擴展,又能提高性能,是系統開發的基礎。要知道,你設計了什麼樣的模型,數據就按什麼樣子去存、去取。web
二 模型設計思路sql
根據上一篇文章的分析,系統須要維護兩類數據,即圖書信息和用戶借閱信息,相應的,咱們設計兩個模型,圖書模型和用戶借閱模型。至於如何設計模型,須要根據業務須要進行分析,就拿圖書模型而言,能夠作以下分析:數據庫
1.模型須要有哪些字段?微信
首先要搞明白的是,在Django裏,模型model相對於數據庫的一種表,模型中的每一個變量,至關於表中的列,由於Django內置ORM,因此,能夠不須要考慮如何建表,如何寫sql進行數據操做,一切就奉行python的編寫習慣。ide
那麼,圖書模型至少須要有如下字段吧:性能
1) 書名,用於標識圖書;學習
2)做者名,用於標識圖書,畢竟同名書籍仍是不少的;spa
3)圖書總冊數,做爲管理系統,須要知道該圖書總共有多少冊吧;
4)圖書可借冊數,做爲借閱系統,須要知道該圖書是否可借,有多少本可借;
5)封面圖,來張圖書靚照,前端頁面不枯燥;
.... 大體,主要的就這麼多了,固然,能夠根據業務須要繼續拓展,如圖書分類,圖書所屬等等,重在思路,就不在此一一展開了。
2.是否須要設計主鍵或索引?
若是模型未指定主鍵,Django會幫忙增長一個自增長的ID字段做爲主鍵,主鍵是惟一索引的,在咱們的場景裏,任何一個字段值都有可能重複的,因此不設計自定義的主鍵了,就交給Django打理吧,須要索引查詢時,就用ID。
3.是否須要設計外鍵?
Django有三種外鍵關係,即一對1、多對1、多對多,理解起來是這樣的,一對一就比如員工和員工號的關係,一個員工只有一個員工號,一個員工號也只對應一個員工;多對一,好比工廠和汽車的關係,一個工廠能夠生產不少汽車,一臺汽車由一個工廠生產;多對多呢,也很常見,好比,一本書能夠有多個做者,一個做者也能夠寫多本書;
把三種關係套在咱們的系統,圖書和借閱用戶的關係就是多對多的,可是,不想把問題搞複雜,在設計上,圖書模型只記錄圖書信息及冊數,根據冊數判斷是否可借;用戶模型用於記錄圖書借閱信息,數據包括借閱人、所借圖書、借還時間等信息,另外,也爲了可以追蹤圖書去向,避免沒必要要的多表聯查。
三 模型實現
根據以上分析,模型大體以下(模型在Django其實就是定義類):
class Book(models.Model): #定義圖書模型 book_name = models.CharField(max_length=100,verbose_name='書名') author_name = models.CharField(max_length=100,verbose_name='做者') total_num = models.IntegerField(default=0,verbose_name='總冊數') available_num = models.PositiveIntegerField(default=0,verbose_name='可借冊數') book_img = models.ImageField(upload_to='static/bookms/img/',verbose_name='封面圖') def __str__(self): return self.book_name class Meta: verbose_name = '圖書' verbose_name_plural = '圖書' #聯合約束 unique_together = ('book_name','author_name') ordering = ['id']
在圖書模型Book類裏又定義了員數據Meta,其實它對模型定義是非必須的,但在實際應用中,定義一些元數據仍是頗有用的,如,ordering能夠指定數據按哪一個字段排序,unique_together聯合約束,verbose_name用於設置模型直觀、可讀的名字。因此,推薦定義一下。
四 其餘資源
關於python學習、分享、交流,筆者開通了微信公衆號【小蟒社區】,感興趣的朋友能夠關注下,歡迎加入,創建屬於咱們本身的小圈子,一塊兒學python。