溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django web開發系列(二)圖書借閱管理系統之模型設計

發布時間:2020-04-08 00:06:34 來源:網絡 閱讀:966 作者:平山 欄目:編程語言

一 前言

在上一篇文章需求分析中,已經大致說明了為什么要開發圖書借閱管理系統、系統應該具備哪些角色或行為、系統如何工作等,對該系統應該有了大致的印象,那接下來的文章就是介紹如何一步步實現。


本文將介紹開發圖書借閱管理系統的第一步,也是關鍵的一步—模型設計。如果將系統精簡,它符合輸入-》驅動-》輸出的模型,具體而言,系統收到http請求(輸入),對請求進行處理(驅動,即邏輯處理+數據庫操作),然后將處理的結果返回前端(輸出),所以在這個模型里,重點是驅動部分(Django名詞:視圖)。乍一看,好像是偏題了,明明說的是Django的模型(model),怎么又扯到視圖(view)了。其實,這里是想把本就緊密的概念先引入進來,混個眼熟,更重要的是,好的模型設計既能適應未來的功能擴展,又能提升性能,是系統開發的基礎。要知道,你設計了什么樣的模型,數據就按什么樣子去存、去取。


二 模型設計思路

根據上一篇文章的分析,系統需要維護兩類數據,即圖書信息和用戶借閱信息,相應的,我們設計兩個模型,圖書模型和用戶借閱模型。至于如何設計模型,需要根據業務需要進行分析,就拿圖書模型而言,可以做如下分析:


1.模型需要有哪些字段?

首先要搞明白的是,在Django里,模型model相對于數據庫的一種表,模型中的每個變量,相當于表中的列,因為Django內置ORM,所以,可以不需要考慮如何建表,如何寫sql進行數據操作,一切就奉行python的編寫習慣。

那么,圖書模型至少需要有以下字段吧:

1) 書名,用于標識圖書;

2)作者名,用于標識圖書,畢竟同名書籍還是很多的;

3)圖書總冊數,作為管理系統,需要知道該圖書總共有多少冊吧;

4)圖書可借冊數,作為借閱系統,需要知道該圖書是否可借,有多少本可借;

5)封面圖,來張圖書靚照,前端頁面不枯燥;


.... 大致,主要的就這么多了,當然,可以根據業務需要繼續拓展,如圖書分類,圖書所屬等等,重在思路,就不在此一一展開了。


2.是否需要設計主鍵或索引?

如果模型未指定主鍵,Django會幫忙增加一個自增加的ID字段作為主鍵,主鍵是唯一索引的,在我們的場景里,任何一個字段值都有可能重復的,所以不設計自定義的主鍵了,就交給Django打理吧,需要索引查詢時,就用ID。


3.是否需要設計外鍵?

Django有三種外鍵關系,即一對一、多對一、多對多,理解起來是這樣的,一對一就好比員工和員工號的關系,一個員工只有一個員工號,一個員工號也只對應一個員工;多對一,比如工廠和汽車的關系,一個工廠可以生產很多汽車,一臺汽車由一個工廠生產;多對多呢,也很常見,比如,一本書可以有多個作者,一個作者也可以寫多本書;

把三種關系套在我們的系統,圖書和借閱用戶的關系就是多對多的,但是,不想把問題搞復雜,在設計上,圖書模型只記錄圖書信息及冊數,根據冊數判斷是否可借;用戶模型用于記錄圖書借閱信息,數據包括借閱人、所借圖書、借還時間等信息,另外,也為了能夠追蹤圖書去向,避免不必要的多表聯查。


三 模型實現

根據以上分析,模型大致如下(模型在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。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女