本文是 Django 學習之旅的完結篇,主要是講述 model 層。model 層是與數據庫打交道的,其中包括 怎么連接數據庫、怎么對數據庫進行增刪改查等。主要邏輯代碼是寫在 models.py 中。
01 新建數據庫
Django 支持的數據庫有 PostgreSQL 、MySQL、SQLite等,基本上市面上的有的數據庫都支持。我是使用 PyCharm 作為開發工具。PyCharm 在新建項目的時候,會自動生成一個 SQLite 數據庫。如果你使用 MySQL 數據庫,你需要自行創建數據庫。我新建一個名為 Django_demo 的項目,在根目錄有個名為 db 的 SQLite 數據庫。
02 連接數據庫
首先打開 PyCharm 軟件,點擊 PyCharm 的右側名為 Database 的選項。這時會彈出操作數據庫的可視化界面。點擊當前選項卡的左上角的“ + ”號 =》Data source =》選擇跟你新建數據庫時相同的數據庫。我新建數據庫是選擇 Sqlite ,所以選擇 Sqlite 連接。
新建連接會彈出一個對話框。我們需要先安裝連接數據庫驅動包,再填寫數據庫訪問的地址、數據庫帳號密碼,最后點擊"Test conntection"按鈕。如果提示"successful",則證明連接數據庫成功。
03 創建字段
在 models.py 文件中,我們新建一個實體類,代碼如下:
# Create your models here.
class Author(models.Model):
name = models.CharField(max_length=50) # 作家的姓名
nationality = models.CharField(max_length=50) # 作家的國籍
class Book(models.Model):
id = models.AutoField(default=1, primary_key=True) # 編號
name = models.CharField(max_length=50) # 書名
author = models.ManyToManyField(Author) # 多對多關系, 作者和書的關系是 n:n
publish_time = models.DateField() # 出版時間
上述代碼非常直觀。每個模型都用一個類表示,該類繼承自 django.db.models.Model。每個模型都有一些類變量,在模型中每個類變量都代表了數據庫中的一個字段。
每個字段通過 Field 類的一個實例表示 —— 例如字符字段 CharField 和日期字段 DateTimeField 。這種方法告訴 Django,每個字段中保存著什么類型的數據。更多字段以及含義可以閱讀 Django 官方文檔。
04 創建表
打開終端,切換目錄到 manage.py 所在目錄。執行一下兩行命令來創建數據庫的表。
python manage.py makemigrations
python manage.py migrate
運行成功的結果如下:
在數據庫也會發現我們剛才新建的表
05 插入與查詢數據
Author 和 Book 表已經新建成功了。你可能有這樣的疑惑。我要怎么往該表插入數據呢?聽我慢慢道來。
在 Django 中,一個模型類對應一個數據庫的表。因此,一個模型類的實例就表示表中的一條數據。為了輸出的數據一目了然,我們需要對上面的 model 進行優化。
# Create your models here.
class Author(models.Model):
name = models.CharField(max_length=50) # 作家的姓名
nationality = models.CharField(max_length=50) # 作家的國籍
def __str__(self): # __unicode__ on Python 2
return self.name
class Book(models.Model):
id = models.AutoField(default=1, primary_key=True) # 編號
name = models.CharField(max_length=50) # 書名
author = models.ManyToManyField(Author) # 多對多關系, 作者和書的關系是 n:n
publish_time = models.DateField() # 出版時間
def __str__(self): # __unicode__ on Python 2
return self.name
當我們在 model.py 對這兩個模型類修改完成之后,我們需要通知數據庫:“我模型已經修改了,你數據庫也要更新呀”。
只需要執行上步的兩行命令即可
python manage.py makemigrations
python manage.py migrate
Django 會對 models.py 進行檢測,自動發現需要更改的,應用到數據庫中去。
1)創建對象
打開 python 終端,利用命令行來創建一個對象。
>>> from demo.models import Author
>>> Author.objects.create(name='金庸', nationality='中國')
<Author: Author object>
看到 <Author: Author object>
意味著成功創建對象,即成功向數據庫插入一條數據。
2)查詢數據
同樣在 python 終端下,執行下面的命令。
>>> Author.objects.get(name='金庸')
<Author: Author object>
3)使用 QuerySet API 查詢數據
從數據庫中查詢出來的結果一般是一個集合,這個集合叫做 QuerySet。而一旦我們建立好數據模型,Django 會自動為我們生成一套數據庫抽象的API。這樣就大大方便我們創建、檢索、更新和刪除對象。
假如現在有個需求,我們需要查詢數據庫中所有的作者并打印出作者的姓名。我們可以利用 QuerySet 支持迭代的特性來進行操作。
authors = Author.objects.all()
for a in authors :
print(a.name)
QuerySet 還有更加復雜的用法, 利用過濾條件來篩選出數據。
// get 是用來獲取一個對象的,如果需要獲取滿足條件的數據集,就要用到filter
Author.objects.filter(name='金庸') # 名稱嚴格等于'金庸'的作家
Author.objects.filter(name_contains='金庸') # 名稱中包含'金庸'字眼的作家
......
還有很多用法,大家可以去看下官網的文檔
4)使用 QuerySet 創建數據
我們之前創建對象都是通過命令行。但是在生產環境中,顯然不能這么操作。那么我們要如何在 py 文件中創建對象呢? QuerySet 創建對象一共有四種辦法
方法 A
Author.objects.create(name='金庸', nationality='中國')
方法B
author = Author(name='金庸', nationality='中國')
author.save()
方法C
author = Author()
author.name='金庸'
author.nationality='中國'
author.save()
方法D
# 首先嘗試獲取,不存在就創建,可以防止重復
Author.objects.get_or_create(name='金庸', nationality='中國')
# 返回值(object, True/False)
5)使用 QuerySet 更新數據
A、單個 object 更新, 適合于 .get(), get_or_create(), update_or_create() 等得到的 obj,和新建很類似。
author = Author.objects.get(name='金庸')
author.name='古龍'
author.enationality='中國'
author.save() # 最后一定不要忘記保存!!!
B、批量更新, 適用于 .all() .filter() .exclude() 等后面
Author.objects.filter(name__contains="金").update('古') # 名稱中包含 "金"的人 都改成古
Author.objects.all().delete() # 刪除所有 Author 記錄
6)使用 QuerySet 刪除數據
刪除的用法跟創建用法是大同小異,在獲取結果后面添加 delete() 方法即可。
Author.objects.filter(name__contains="金").delete() # 刪除 名稱中包含 "金"的作家
Django 學習之旅不知不覺到了終點了。終點又是另一個新的起點。我們雖然對 Django 已經有大概的認識,僅僅了解些皮毛,但是還需要深入學習,掌握其精髓。后續我會學習然后分享 Django 一些精髓用法。
系列文章:
Django學習之旅(一)
Django學習之旅(二)
Django學習之旅(三)
Django學習之旅(四)
Django學習之旅(五)
推薦閱讀:
爬蟲系列的總結