Django Web開發學習筆記(5)


第五部分 Model 層

創建一個app工程。app和project的區別引用DjangoBook的說法是:

一個project包含很多個Django app以及對它們的配置。

技術上,project的作用是提供配置文件,比方說哪里定義數據庫連接信息, 安裝的app列表, TEMPLATE_DIRS ,等等。

一個app是一套Django功能的集合,通常包括模型和視圖,按Python的包結構的方式存在。

例如,Django本身內建有一些app,例如注釋系統和自動管理界面。 app的一個關鍵點是它們是很容易移植到其他project和被多個project復用。

一、創建app包

python manage.py startapp yourappName [yourappDestination]

觀察一下默認生成的文件的名字:

yourappName--------

                   --------__init__.py

                   --------admin.py

                   --------models.py

        --------tests.py

                   --------views.py

我們早些時候談到。MTV里的M代表模型。 Django模型是用Python代碼形式表述的數據在數據庫中的定義。 對數據層來說它等同於 CREATE TABLE 語句,只不過執行的是Python代碼而不是 SQL,而且還包含了比數據庫字段定義更多的含義。 Django用模型在后台執行SQL代碼並把結果用Python的數據結構來描述。 Django也使用模型來呈現SQL無法處理的高級概念。(DjangoBook)

自省(運行時自動識別數據庫)會導致過載和有數據完整性問題。 為了提供方便的數據訪問API, Django需要以 某種方式 知道數據庫層內部信息,有兩種實現方式。第一種方式是用Python明確地定義數據模型,第二種方式是通過自省來自動偵測識別數據模型。

第二種方式看起來更清晰,因為數據表信息只存放在一個地方-數據庫里,但是會帶來一些問題。 首先,運行時掃描數據庫會帶來嚴重的系統過載。 如果每個請求都要掃描數據庫的表結構,或者即便是 服務啟動時做一次都是會帶來不能接受的系統過載。(有人認為這個程度的系統過載是可以接受的,而Django開發者的目標是盡可能地降低框架的系統過載)。第二,某些數據庫,尤其是老版本的MySQL,並未完整存儲那些精確的自省元數據。

編寫Python代碼是非常有趣的,保持用Python的方式思考會避免你的大腦在不同領域來回切換。 盡可能的保持在單一的編程環境/思想狀態下可以幫助你提高生產率。 不得不去重復寫SQL,再寫Python代碼,再寫SQL,…,會讓你頭都要裂了。

把數據模型用代碼的方式表述來讓你可以容易對它們進行版本控制。 這樣,你可以很容易了解數據層 的變動情況。

SQL只能描述特定類型的數據字段。 例如,大多數數據庫都沒有專用的字段類型來描述Email地址、URL。 而用Django的模型可以做到這一點。 好處就是高級的數據類型帶來更高的效率和更好的代碼復用。

SQL還有在不同數據庫平台的兼容性問題。 發布Web應用的時候,使用Python模塊描述數據庫結構信息可以避免為MySQL, PostgreSQL, and SQLite編寫不同的CREATE TABLE

二、創建模型

打開model.py並添加下面的語句:

from django.db import models

# Create your models here.
class Student(models.Model):
    name = models.charField(max_length=30)
    address = models.charField(max_length = 50)
    city = models.charField(max_length=30)
    grade = models.charField(max_length = 20)
    website = models.URLField()

class School(models.Model):
    name = models.charField(max_length=30)
    city = models.ManyToManyField(Student)
    createDate = models.DateField()

這類似於SQL中創建表的語句。charField可以理解為數據庫中的varchar()字段。另外需要注意的是表School中的幾種特殊的數據結構:

ManyToManyField(Student).

“每個數據庫表對應一個類”這條規則的例外情況是多對多關系。School有一個 多對多字段 叫做 Student 。 該字段表明一個學校可以有很多名的學生,Django創建了一個額外的表(多對多連接表)來處理這種映射關系。

最后需要注意的是,我們並沒有顯式地為這些模型定義任何主鍵。 除非你單獨指明,否則Django會自動為每個模型生成一個自增長的整數主鍵字段每個Django模型都要求有單獨的主鍵。也就是每條記錄的id.

三、模型安裝

我們創建完APP后,怎樣將我們的APP與Project進行連接起來呢?上面我們看到,project的作用是提供配置文件,安裝APP.因此我們可以猜到是放置在創建工程時自動生成的__setting__目錄下面

再次編輯 settings.py 文件, 找到 INSTALLED_APPS 設置。 INSTALLED_APPS 告訴 Django 項目哪些 app 處於激活狀態。 

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
)

我們在這個元組型數據中添加如下代碼:

'DjangoE_1.formEtc"

下面我們就可以創建表了。在創建表之前我們應該先檢查模型的有效性,執行

Python manage.py validate

執行結果為:0 error found 表明創建的模型是正確的

創建模型成功后,我們生成SQL表,執行

Python manage.py sqlall yourAppName

執行結果輸出如下:

我們可以看到,輸出結構就是我們創建的模型的SQL語句形式。注意中間生成的school_city的映射表。就是我們上面提到的ManyToMany結構時生成的映射關系表。分別以school_id和student_id作為字段進行關聯。

sqlall 命令並沒有在數據庫中真正創建數據表,只是把SQL語句段打印出來,這樣你可以看到Django究竟會做些什么。 如果你想這么做的話,你可以把那些SQL語句復制到你的數據庫客戶端執行,或者通過Unix管道直接進行操作(例如,`` python manager.py sqlall books | psql mydb`` )。不過,Django提供了一種更為簡易的提交SQL語句至數據庫的方法: `` syncdb`` 命令

python manage.py syncdb

該命令會將你創建的SQL 語句同步到你的數據庫中

我們創建了數據庫創建了一個超級用戶。

四、數據的訪問

執行命令:Python manage.py shell


2、在該命令下,我們可以利用Python語句對表進行增刪查等任務,這些任務的完成都是Django提供的API完成的。如下:

import yourAppName.models as K

t1 = K.Student(name='ywc', city='Beijing',grade='Master')

t1.save()

t2=  K.Student(name='wcy', city='Beijing',grade='doctor')

t2.save()

這樣我們就完成了對表的插入的任務,需要注意的是只有運行.save()的時候才能將數據插入成功

下面我們查看每條代碼的執行結果:

 

需要注意的是我們在對表進行初始化的時候並沒有對表進行任何的操作,只有在進行save()的時候,我們才類似於執行了SQL中的INSERT語句,將初始化的數據插入到了表中

3、總結上面的操作,我們已經學習了表的創建、插入,下面我們學習選擇,也就是過濾操作:

表名 + objects.filter(**)。類似於Where語句操作。

 

4、刪除對象

如圖所示:需要注意的是通過get方法返回的對象有多個事我們只能通過filter進行刪除。貌似get方法只能獲得單個對象。如果希望刪除整個對象可以直接調用T.Student.objects.all().delete()函數

下一章我們介紹怎樣對站點進行管理的操作!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM