滴水石穿缎患,繩鋸木斷~學習貴在持之以恒!
今天是2019年1月19日阎肝,小叮當繼續(xù)為大家分享Django干貨挤渔。主要內(nèi)容有:Django的ORM簡介、數(shù)據(jù)庫連接配置风题、模型的創(chuàng)建與映射判导、數(shù)據(jù)的增刪改查。
一沛硅、Django的ORM簡介
1.ORM
ORM的全稱是Object Relational Mapping翻譯過來就是對象關(guān)系映射的意思眼刃。
2.ORM的優(yōu)勢
不用直接編寫SQL代碼,只需像操作對象一樣從數(shù)據(jù)庫操作數(shù)據(jù)摇肌。
3.django模型映射關(guān)系
django中模型類擂红、類屬性和數(shù)據(jù)庫的對應關(guān)系如下:
(1)模型類必須都寫在app下的models.py文件中。
(2)模型如果需要映射到數(shù)據(jù)庫,所在的app必須被安裝.
(3)一個數(shù)據(jù)表對應一個模型類,表中的字段,對應模型中的類屬性.
二围小、數(shù)據(jù)庫連接配置
準備工作
(1)在項目的主目錄下找到settings.py文件中的“DATABASES"
其中”?ENGINE“表示存儲引擎,默認連接的是”sqlite3"數(shù)據(jù)庫昵骤∈骷睿“sqlite3"是Django中自帶的一個小巧數(shù)據(jù)庫。
我們以常使用mysql數(shù)據(jù)庫為例說明:
(2)將默認的”DATABASES"注釋掉
(3)在xshell中使用命令進入mysql
mysql?-u?root?-p
用戶名密碼如下
如上使用root用戶后涉茧,輸入密碼qwe123即可進入mysql
(4)建立新的數(shù)據(jù)庫管理用戶
創(chuàng)建一個管理員用戶xdd(小叮當)賬號赴恨,密碼為xdd:
CREATE?USER?'xdd'@'%'IDENTIFIED?BY?'xdd';
給這個"xdd"用戶授予所有遠程訪問,這個用戶主要用于管理整個數(shù)據(jù)庫伴栓,備份伦连,還原等操作。
GRANT?ALL?ON?*.*?TO?'xdd'@'%';
使授權(quán)立即生效:
FLUSH?PRIVILEGES;
操作如下
(5)查看當前數(shù)據(jù)庫钳垮,并新建數(shù)據(jù)庫用于django項目
使用命令查看數(shù)據(jù)庫
show?databases;
查看結(jié)果
新建數(shù)據(jù)庫惑淳,名為“mydb”
create?database?mydb;
結(jié)果如下:
2.配置數(shù)據(jù)庫連接
(1)在主目錄的settings.py中寫入如下連接代碼:
DATABASES?=?{
'default':?{
'ENGINE':?'django.db.backends.mysql',??#?數(shù)據(jù)庫引擎
'NAME':?'mydb',????????????????#數(shù)據(jù)庫名稱
'USER':?'xdd',???????????????#?鏈接數(shù)據(jù)庫的用戶名
'PASSWORD':?'xdd',??????#?鏈接數(shù)據(jù)庫的密碼
'HOST':?'192.168.255.130',???????????#?mysql服務器的域名和ip地址
'PORT':?'3306',????????????????#?mysql的一個端口號,默認是3306
}
}
如下圖所示
3.pymysql數(shù)據(jù)庫連接器配置
使用“exit"退出mysql
”在我們的django虛擬環(huán)境中安裝pymysql
(1)進入項目虛擬環(huán)境查看是否裝有pymysql
查看當前虛擬環(huán)境
workon
進入項目虛擬環(huán)境
workon?djtest2.1
查看當前安裝包
pip?list
結(jié)果如下
(2)如果沒有pymysql使用命令安裝pymysql
安裝pymysql
pip?install?pymysql
如下
(3)配置pymysql(因為django默認的配置不是pymysql)
在主目錄的“_init_py”中寫入如下代碼
import?pymysql
pymysql.install_as_MySQLdb()
如下
這時pymysql下可能會有“紅波浪線”提示
我們點擊pycharm中的file----settings----project interpreter 查看,只要確認我們配置的遠程解釋器中已安裝pymysql即可饺窿。
三歧焦、模型的創(chuàng)建與映射
1.新建測試app
(1)在pycharm的“tool"中找到”Run manage.py Task...“
(2)使用命令新建app名為model_test
命令為:
startapp?model_test
結(jié)果如下
(3)在項目文件夾”hello_django“處右鍵,使用deployment進行download下載肚医。
執(zhí)行完畢后即可發(fā)現(xiàn)我們新建的"model_test"
(4)在主目錄“settings.py"中注冊app
在INSTALLED_APPS列表中添加”model_test“
2.創(chuàng)建類
我們在mode_test下找到models.py創(chuàng)建user類(數(shù)據(jù)表)
from?django.db?import?models
#?Create?your?models?here.
#類---數(shù)據(jù)表
#類屬性---字段
#1.定義模型類(數(shù)據(jù)表)
class?User(models.Model):
#配置id字段绢馍,設(shè)置為自增長,并設(shè)為主鍵(也可省略肠套,使用系統(tǒng)默認設(shè)置的id)
id?=?models.AutoField(primary_key=True)
#配置name字段舰涌,設(shè)置為字符類型,最大長度為50
name?=?models.CharField(max_length=50)
#配置age字段你稚,設(shè)置為整數(shù)類型
age?=?models.IntegerField(max_length=50)
3.生成映射文件
(1)方法一:在linux系統(tǒng)對應項目目錄中執(zhí)行命令
python?manage.py?makemigrations model_test
(2)方法二:在pycharm中執(zhí)行
值得注意瓷耙,如果makemigrations命令后面不加app的名字,系統(tǒng)默認為所有app生成映射文件刁赖。
我們執(zhí)行”deployment"中的“download"進行代碼同步后搁痛,查看model_test下的migrations文件夾即可看到我們生成的”0001_intial.py“映射文件。
4.將映射文件數(shù)據(jù)提交到數(shù)據(jù)庫
(1)方法一:在linux系統(tǒng)對應項目目錄中執(zhí)行命令
python?manage.py?migrate?model_test
(2)方法二:在pycharm中執(zhí)行
同樣宇弛,migrate命令后不跟app的名字時鸡典,系統(tǒng)默認為全部app做數(shù)據(jù)庫的映射。
5.在服務器端登錄數(shù)據(jù)庫進行查看
使用我們創(chuàng)建的xdd用戶進行登錄mysql
mysql?-u?xdd?-p
輸入密碼xdd后枪芒,使用我們連接到django項目的mydb數(shù)據(jù)庫
use?mydb;
查看表格
show?tables;
結(jié)果如下
可以看到系統(tǒng)為我們創(chuàng)建的表“model_test_user"
值得注意的是轿钠,其命名規(guī)則為:app名字+下劃線+類名的小寫
在本例中,我們的app名字為model_test?我們創(chuàng)建的類名為User
所以系統(tǒng)為我們創(chuàng)建了名字為”model_test_user"的表病苗。
四、數(shù)據(jù)的增刪改查
前言
使用Djiango對數(shù)據(jù)庫進行增刪改查時症汹,我們需要了解一下數(shù)據(jù)庫相關(guān)的接口(QuerySet API)
①從數(shù)據(jù)庫中查詢出來的結(jié)果一般是一個集合硫朦,這個集合叫做 QuerySet.
②QuerySet是可迭代對象.
③.QuerySet支持切片, 不支持負索引.
④可以用list強行將QuerySet變成列表.
1.環(huán)境配置
(1)在model_test下的views.py中導入我們定義好的user類并定義好增刪改查的視圖函數(shù)框架(用pass代替函數(shù)體)
代碼如下:
from?django.shortcuts?import?render
#?Create?your?views?here.
from?.models?import?User
from?django.http?import?HttpResponse
#增加數(shù)據(jù)
def?add_user(request):
pass
#刪除數(shù)據(jù)
def?delete_user(request):
pass
#更改數(shù)據(jù)
def?update_user(request):
pass
#查詢數(shù)據(jù)
def?search_user(request):
pass
(2)在model_test下新建urls.py,在主目錄中的urls.py中為model_test分配路由背镇。
在model_test下新建urls.py
在主目錄中為model_test分配路由
代碼如下
path('model/',include('model_test.urls')),
(3)在mode_test下的urls.py中配置分路由
#!/usr/bin/env?python
#?-*-?coding:utf-8?-*-
__author__?=?'IT小叮當'
__time__?=?'2019-01-22?20:00'
from?django.contrib?import?admin
from?django.urls?import?path,re_path,include
from?.?import?views
urlpatterns?=?[
path('add/',views.add_user),
path('delete/',views.delete_user),
path('update/',views.update_user),
path('search/',views.search_user),
]
3.編寫添加數(shù)據(jù)視圖函數(shù)
方法一:實例化類進行傳參
(1)在視圖函數(shù)中重新定義add_user
def?add_user(request):
#方法一
xdd?=?User(name='xdd',age=18)
xdd.save()
return?HttpResponse('小叮當插入數(shù)據(jù)成功咬展!')
(2)在瀏覽器中訪問
(3)xshell連接服務端查看mysql
方法二:先實例化類后傳參
(1)在視圖函數(shù)中重新定義add_user
def?add_user(request):
#方法二
xdd=User()
xdd.name?=?'小叮當'
xdd.age?=?18
xdd.save()
return?HttpResponse('小叮當使用方法二插入數(shù)據(jù)成功泽裳!')
(2)在瀏覽器中訪問
(3)xshell連接服務端查看mysql
方法三:使用objects.create傳參
(1)在視圖函數(shù)中重新定義add_user
def?add_user(request):
#方法三
User.objects.create(name='老叮當',age=19)
return?HttpResponse('小叮當使用方法三插入數(shù)據(jù)成功!')
(2)在瀏覽器中訪問
(3)xshell連接服務端查看mysql
值得注意破婆,當我們再次刷新添加數(shù)據(jù)頁面后涮总,查看mysql,發(fā)現(xiàn)數(shù)據(jù)已然重復~
刷新后祷舀,查看mysql
那么瀑梗,怎樣才能在刷新頁面的同時,不會造成數(shù)據(jù)庫的重復添加呢裳扯?下面抛丽,我們來看方法四~
方法四:使用objects.get_or_create()傳參
(1)在視圖函數(shù)中重新定義add_user
def?add_user(request):
#方法四
User.objects.get_or_create(name='小小叮當',age=17)
return?HttpResponse('小叮當使用方法四插入數(shù)據(jù)成功!')
(2)在瀏覽器中訪問
(3)xshell連接服務端查看mysql
再次刷新網(wǎng)頁
查看mysql
可以看到饰豺,使用方法四get_or_create()傳參新增的數(shù)據(jù)不會出現(xiàn)重復亿鲜。
4.查詢數(shù)據(jù)
由于更改和刪除操作都是建立在查詢的基礎(chǔ)上,所以我們先來了解在django中如何查詢數(shù)據(jù)冤吨。
查詢所有?objects.all()
(1)在視圖函數(shù)中重新定義search_user
def?search_user(request):
#查詢所有數(shù)據(jù)
all_info?=?User.objects.all()
return?HttpResponse(all_info)
(2)在瀏覽器中訪問
這時蒿柳,我們發(fā)現(xiàn)瀏覽器中出現(xiàn)了5個用戶對象,但好像什么都看不出來漩蟆!這就需要我們在User類中垒探,重新定義輸出方法了。
(3)在models.py里的User類中爆安,重新定義輸出方法__str__
class?User(models.Model):
#配置id字段叛复,設(shè)置為自增長,并設(shè)為主鍵(也可省略扔仓,使用系統(tǒng)默認設(shè)置的id)
id?=?models.AutoField(primary_key=True)
#配置name字段褐奥,設(shè)置為字符類型,最大長度為50
name?=?models.CharField(max_length=50)
#配置age字段翘簇,設(shè)置為整數(shù)類型
age?=?models.IntegerField(max_length=50)
#定義輸出
def?__str__(self):
return?'User'%(self.id,self.name,self.age)
(4)在瀏覽器中查看
這次變成了5個連續(xù)的User,也不是我們想要看到的結(jié)果扒寺搿!這是因為__str__()方法(注意str前后是兩個下橫線)對print有效版保。
我們在視圖函數(shù)中呜笑,加入print語句在后臺查看,
#查詢數(shù)據(jù)
def?search_user(request):
#查詢所有數(shù)據(jù)
all_info?=?User.objects.all()
print(all_info)
return?HttpResponse(all_info)
在后臺查看如下
可以看到彻犁,此時已經(jīng)可以輸出我們想要查詢的結(jié)果了叫胁。
條件查詢 objects.filter()
(1)定義視圖函數(shù)
def?search_user(request):
#查詢所有數(shù)據(jù)
#?all_info?=?User.objects.all()
#?print(all_info)
#?查詢滿足條件
meet_info?=?User.objects.filter(name='小叮當')
print(meet_info)
return?HttpResponse(meet_info)
(2)瀏覽器中查看
(3)后臺查看
定義視圖函數(shù),對比輸出
#查詢數(shù)據(jù)def search_user(request): ? ?#查詢所有數(shù)據(jù) ? ?all_info = User.objects.all()
# print(all_info) ? ?# 查詢滿足條件 ? ?meet_info = User.objects.filter(name='小叮當')? #QuerSet ? ?print('我是查詢到的所有QuerSset',all_info)
print('我是一條數(shù)據(jù)',meet_info[0])? #一個模型類的實例對象----數(shù)據(jù)表的一條數(shù)據(jù) ? ?return HttpResponse(meet_info)
在瀏覽器端刷新后汞幢,再次在后臺查看
條件查詢 objects.get()
定義視圖函數(shù)
#查詢數(shù)據(jù)
def?search_user(request):
meet_info?=?User.objects.get(id=3)
print('我通過get方法得到',meet_info)
return?HttpResponse(meet_info)
瀏覽器中刷新后驼鹅,在后臺查看
值得注意,使用objects.get()方法進行查詢時,查詢的條件需要確笔涔常“唯一性”豺型,例如id等字段。
5.更新數(shù)據(jù)
更新數(shù)據(jù)的思路就是:先查找到數(shù)據(jù)买乃,再進行更新操作
方法一:get()方法找到數(shù)據(jù)姻氨,再屬性賦值修改后保存
(1)定義視圖函數(shù)
#更改數(shù)據(jù)
def?update_user(request):
meet_info?=?User.objects.get(id=3)
meet_info.name='不老叮當'
meet_info.save()
return?HttpResponse('我將老叮當改為了,不老叮當剪验!')
(2)瀏覽器中查看
(3)在xshell中查看數(shù)據(jù)庫
可以看到肴焊,id為3的老叮當,已經(jīng)被成功修改為不老叮當~
方法二:使用filter()查詢數(shù)據(jù)碉咆,用其自帶的update()方法進行數(shù)據(jù)更新
(1)定義視圖函數(shù)
#更改數(shù)據(jù)
def?update_user(request):
User.objects.filter(name='不老叮當').update(name='神仙小叮當')
return?HttpResponse('我將不老叮當改成了神仙小叮當抖韩!')
(2)瀏覽器中查看
(3)xshell查看服務端數(shù)據(jù)庫
可以看到,“不老叮當”已經(jīng)被成功改為“神仙小叮當”了疫铜。
添加新的字段
當我們想要為數(shù)據(jù)表添加新的字段時茂浮,在models.py中的模型類中添加即可。需要注意的是壳咕,添加字段會改變表的結(jié)構(gòu)席揽,因此需要重新生成映射文件,將映射文件提交到數(shù)據(jù)庫谓厘。
(1)在模型類中添加新字段
class?User(models.Model):
#配置id字段幌羞,設(shè)置為自增長,并設(shè)為主鍵(也可省略竟稳,使用系統(tǒng)默認設(shè)置的id)
id?=?models.AutoField(primary_key=True)
#配置name字段属桦,設(shè)置為字符類型,最大長度為50
name?=?models.CharField(max_length=50)
#配置age字段他爸,設(shè)置為整數(shù)類型
age?=?models.IntegerField(max_length=50)
#添加新字段聂宾,一定要設(shè)置最大長度和默認值
city?=?models.CharField(max_length=50,default='洛陽')
#定義輸出
def?__str__(self):
return?'User'%(self.id,self.name,self.age)
(2)生成映射文件
在tools中找到“Run manage.py Task"
執(zhí)行命令makemigrations model_test
可以看到,city字段已被添加到user模型類中诊笤。
(3)將映射文件提交到數(shù)據(jù)庫
執(zhí)行命令migrate model_test
可以看到系谐,city字段已經(jīng)添加完成。
(4)在xshell中查看數(shù)據(jù)庫
可以看到city字段已經(jīng)添加成功讨跟。
將某個字段的值全部修改為特定值
例如纪他,我們將city中的”洛陽“全部修改為”北京“
(1)定義視圖函數(shù)
def?update_user(request):
User.objects.all().update(city='北京')
return?HttpResponse('我將所有的city屬性全改為了北京!')
(2)在瀏覽器中查看
(3)通過xshell查看服務器端的數(shù)據(jù)庫
可以看到晾匠,所有city字段已更改為了”北京“茶袒。
6.刪除數(shù)據(jù)
方法一:通過objects.get().delete()來刪除數(shù)據(jù)
(1)定義視圖函數(shù)
#刪除數(shù)據(jù)
def?delete_user(request):
User.objects.get(id=4).delete()
return?HttpResponse('我刪除了id=4的數(shù)據(jù)!')
(2)瀏覽器中查看
(3)通過xshell在服務端查看數(shù)據(jù)庫
方法二:通過objects.filter().delete()來刪除數(shù)據(jù)
(1)定義視圖函數(shù)
#刪除數(shù)據(jù)
def?delete_user(request):
#?User.objects.get(id=4).delete()
User.objects.filter(name='小小叮當').delete()
return?HttpResponse('我刪除name為小小叮當?shù)臄?shù)據(jù)凉馆!')
(2)瀏覽器中查看
(3)xshell中查看服務端數(shù)據(jù)庫
可以看到名為“小小叮當”的數(shù)據(jù)已被我們成功刪除~