溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django web開(kāi)發(fā)系列(二)圖書借閱管理系統(tǒng)之模型設(shè)計(jì)

發(fā)布時(shí)間:2020-04-08 00:06:34 來(lái)源:網(wǎng)絡(luò) 閱讀:941 作者:平山 欄目:編程語(yǔ)言

一 前言

在上一篇文章需求分析中,已經(jīng)大致說(shuō)明了為什么要開(kāi)發(fā)圖書借閱管理系統(tǒng)、系統(tǒng)應(yīng)該具備哪些角色或行為、系統(tǒng)如何工作等,對(duì)該系統(tǒng)應(yīng)該有了大致的印象,那接下來(lái)的文章就是介紹如何一步步實(shí)現(xiàn)。


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


二 模型設(shè)計(jì)思路

根據(jù)上一篇文章的分析,系統(tǒng)需要維護(hù)兩類數(shù)據(jù),即圖書信息和用戶借閱信息,相應(yīng)的,我們?cè)O(shè)計(jì)兩個(gè)模型,圖書模型和用戶借閱模型。至于如何設(shè)計(jì)模型,需要根據(jù)業(yè)務(wù)需要進(jìn)行分析,就拿圖書模型而言,可以做如下分析:


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

首先要搞明白的是,在Django里,模型model相對(duì)于數(shù)據(jù)庫(kù)的一種表,模型中的每個(gè)變量,相當(dāng)于表中的列,因?yàn)镈jango內(nèi)置ORM,所以,可以不需要考慮如何建表,如何寫sql進(jìn)行數(shù)據(jù)操作,一切就奉行python的編寫習(xí)慣。

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

1) 書名,用于標(biāo)識(shí)圖書;

2)作者名,用于標(biāo)識(shí)圖書,畢竟同名書籍還是很多的;

3)圖書總冊(cè)數(shù),作為管理系統(tǒng),需要知道該圖書總共有多少冊(cè)吧;

4)圖書可借冊(cè)數(shù),作為借閱系統(tǒng),需要知道該圖書是否可借,有多少本可借;

5)封面圖,來(lái)張圖書靚照,前端頁(yè)面不枯燥;


.... 大致,主要的就這么多了,當(dāng)然,可以根據(jù)業(yè)務(wù)需要繼續(xù)拓展,如圖書分類,圖書所屬等等,重在思路,就不在此一一展開(kāi)了。


2.是否需要設(shè)計(jì)主鍵或索引?

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


3.是否需要設(shè)計(jì)外鍵?

Django有三種外鍵關(guān)系,即一對(duì)一、多對(duì)一、多對(duì)多,理解起來(lái)是這樣的,一對(duì)一就好比員工和員工號(hào)的關(guān)系,一個(gè)員工只有一個(gè)員工號(hào),一個(gè)員工號(hào)也只對(duì)應(yīng)一個(gè)員工;多對(duì)一,比如工廠和汽車的關(guān)系,一個(gè)工廠可以生產(chǎn)很多汽車,一臺(tái)汽車由一個(gè)工廠生產(chǎn);多對(duì)多呢,也很常見(jiàn),比如,一本書可以有多個(gè)作者,一個(gè)作者也可以寫多本書;

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


三 模型實(shí)現(xiàn)

根據(jù)以上分析,模型大致如下(模型在Django其實(shí)就是定義類):


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='總冊(cè)數(shù)')
    available_num = models.PositiveIntegerField(default=0,verbose_name='可借冊(cè)數(shù)')
    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 = '圖書'
        #聯(lián)合約束
        unique_together = ('book_name','author_name')
        ordering = ['id']


在圖書模型Book類里又定義了員數(shù)據(jù)Meta,其實(shí)它對(duì)模型定義是非必須的,但在實(shí)際應(yīng)用中,定義一些元數(shù)據(jù)還是很有用的,如,ordering可以指定數(shù)據(jù)按哪個(gè)字段排序,unique_together聯(lián)合約束,verbose_name用于設(shè)置模型直觀、可讀的名字。所以,推薦定義一下。



四 其他資源

關(guān)于python學(xué)習(xí)、分享、交流,筆者開(kāi)通了微信公眾號(hào)【小蟒社區(qū)】,感興趣的朋友可以關(guān)注下,歡迎加入,建立屬于我們自己的小圈子,一起學(xué)python。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI