本文是 Django 學習之旅的完結篇,主要是講述 model 層。model 層是與數(shù)據(jù)庫打交道的晶框,其中包括 怎么連接數(shù)據(jù)庫、怎么對數(shù)據(jù)庫進行增刪改查等懂从。主要邏輯代碼是寫在 models.py 中授段。
01 新建數(shù)據(jù)庫
Django 支持的數(shù)據(jù)庫有 PostgreSQL 、MySQL番甩、SQLite等侵贵,基本上市面上的有的數(shù)據(jù)庫都支持。我是使用 PyCharm 作為開發(fā)工具缘薛。PyCharm 在新建項目的時候窍育,會自動生成一個 SQLite 數(shù)據(jù)庫。如果你使用 MySQL 數(shù)據(jù)庫宴胧,你需要自行創(chuàng)建數(shù)據(jù)庫漱抓。我新建一個名為 Django_demo 的項目,在根目錄有個名為 db 的 SQLite 數(shù)據(jù)庫恕齐。
02 連接數(shù)據(jù)庫
首先打開 PyCharm 軟件乞娄,點擊 PyCharm 的右側名為 Database 的選項。這時會彈出操作數(shù)據(jù)庫的可視化界面显歧。點擊當前選項卡的左上角的“ + ”號 =》Data source =》選擇跟你新建數(shù)據(jù)庫時相同的數(shù)據(jù)庫仪或。我新建數(shù)據(jù)庫是選擇 Sqlite ,所以選擇 Sqlite 連接。
新建連接會彈出一個對話框士骤。我們需要先安裝連接數(shù)據(jù)庫驅動包范删,再填寫數(shù)據(jù)庫訪問的地址、數(shù)據(jù)庫帳號密碼拷肌,最后點擊"Test conntection"按鈕瓶逃。如果提示"successful"束铭,則證明連接數(shù)據(jù)庫成功。
03 創(chuàng)建字段
在 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。每個模型都有一些類變量辞友,在模型中每個類變量都代表了數(shù)據(jù)庫中的一個字段。
每個字段通過 Field 類的一個實例表示 —— 例如字符字段 CharField 和日期字段 DateTimeField 会通。這種方法告訴 Django,每個字段中保存著什么類型的數(shù)據(jù)娄周。更多字段以及含義可以閱讀 Django 官方文檔涕侈。
04 創(chuàng)建表
打開終端,切換目錄到 manage.py 所在目錄煤辨。執(zhí)行一下兩行命令來創(chuàng)建數(shù)據(jù)庫的表裳涛。
python manage.py makemigrations
python manage.py migrate
運行成功的結果如下:
在數(shù)據(jù)庫也會發(fā)現(xiàn)我們剛才新建的表
05 插入與查詢數(shù)據(jù)
Author 和 Book 表已經(jīng)新建成功了。你可能有這樣的疑惑众辨。我要怎么往該表插入數(shù)據(jù)呢端三?聽我慢慢道來。
在 Django 中鹃彻,一個模型類對應一個數(shù)據(jù)庫的表郊闯。因此,一個模型類的實例就表示表中的一條數(shù)據(jù)蛛株。為了輸出的數(shù)據(jù)一目了然团赁,我們需要對上面的 model 進行優(yōu)化。
# 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 對這兩個模型類修改完成之后谨履,我們需要通知數(shù)據(jù)庫:“我模型已經(jīng)修改了欢摄,你數(shù)據(jù)庫也要更新呀”。
只需要執(zhí)行上步的兩行命令即可
python manage.py makemigrations
python manage.py migrate
Django 會對 models.py 進行檢測屉符,自動發(fā)現(xiàn)需要更改的,應用到數(shù)據(jù)庫中去锹引。
1)創(chuàng)建對象
打開 python 終端矗钟,利用命令行來創(chuàng)建一個對象。
>>> from demo.models import Author
>>> Author.objects.create(name='金庸', nationality='中國')
<Author: Author object>
看到 <Author: Author object>
意味著成功創(chuàng)建對象嫌变,即成功向數(shù)據(jù)庫插入一條數(shù)據(jù)吨艇。
2)查詢數(shù)據(jù)
同樣在 python 終端下,執(zhí)行下面的命令腾啥。
>>> Author.objects.get(name='金庸')
<Author: Author object>
3)使用 QuerySet API 查詢數(shù)據(jù)
從數(shù)據(jù)庫中查詢出來的結果一般是一個集合东涡,這個集合叫做 QuerySet冯吓。而一旦我們建立好數(shù)據(jù)模型,Django 會自動為我們生成一套數(shù)據(jù)庫抽象的API疮跑。這樣就大大方便我們創(chuàng)建组贺、檢索、更新和刪除對象祖娘。
假如現(xiàn)在有個需求失尖,我們需要查詢數(shù)據(jù)庫中所有的作者并打印出作者的姓名。我們可以利用 QuerySet 支持迭代的特性來進行操作渐苏。
authors = Author.objects.all()
for a in authors :
print(a.name)
QuerySet 還有更加復雜的用法, 利用過濾條件來篩選出數(shù)據(jù)掀潮。
// get 是用來獲取一個對象的,如果需要獲取滿足條件的數(shù)據(jù)集琼富,就要用到filter
Author.objects.filter(name='金庸') # 名稱嚴格等于'金庸'的作家
Author.objects.filter(name_contains='金庸') # 名稱中包含'金庸'字眼的作家
......
還有很多用法仪吧,大家可以去看下官網(wǎng)的文檔
4)使用 QuerySet 創(chuàng)建數(shù)據(jù)
我們之前創(chuàng)建對象都是通過命令行。但是在生產環(huán)境中鞠眉,顯然不能這么操作薯鼠。那么我們要如何在 py 文件中創(chuàng)建對象呢? QuerySet 創(chuàng)建對象一共有四種辦法
方法 A
Author.objects.create(name='金庸'凡蚜, nationality='中國')
方法B
author = Author(name='金庸'人断, nationality='中國')
author.save()
方法C
author = Author()
author.name='金庸'
author.nationality='中國'
author.save()
方法D
# 首先嘗試獲取,不存在就創(chuàng)建朝蜘,可以防止重復
Author.objects.get_or_create(name='金庸'恶迈, nationality='中國')
# 返回值(object, True/False)
5)使用 QuerySet 更新數(shù)據(jù)
A、單個 object 更新, 適合于 .get(), get_or_create(), update_or_create() 等得到的 obj谱醇,和新建很類似暇仲。
author = Author.objects.get(name='金庸')
author.name='古龍'
author.enationality='中國'
author.save() # 最后一定不要忘記保存!8笨省奈附!
B、批量更新, 適用于 .all() .filter() .exclude() 等后面
Author.objects.filter(name__contains="金").update('古') # 名稱中包含 "金"的人 都改成古
Author.objects.all().delete() # 刪除所有 Author 記錄
6)使用 QuerySet 刪除數(shù)據(jù)
刪除的用法跟創(chuàng)建用法是大同小異煮剧,在獲取結果后面添加 delete() 方法即可斥滤。
Author.objects.filter(name__contains="金").delete() # 刪除 名稱中包含 "金"的作家
Django 學習之旅不知不覺到了終點了。終點又是另一個新的起點勉盅。我們雖然對 Django 已經(jīng)有大概的認識佑颇,僅僅了解些皮毛,但是還需要深入學習草娜,掌握其精髓挑胸。后續(xù)我會學習然后分享 Django 一些精髓用法。
系列文章:
Django學習之旅(一)
Django學習之旅(二)
Django學習之旅(三)
Django學習之旅(四)
Django學習之旅(五)
推薦閱讀:
爬蟲系列的總結