零基礎(chǔ)入手Django(六):模型基礎(chǔ)1

滴水石穿缎患,繩鋸木斷~學習貴在持之以恒!

今天是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ù)已被我們成功刪除~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薪寓,一起剝皮案震驚了整個濱河市乾巧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌预愤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咳胃,死亡現(xiàn)場離奇詭異植康,居然都是意外死亡,警方通過查閱死者的電腦和手機展懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門销睁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人存崖,你說我怎么就攤上這事冻记。” “怎么了来惧?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵冗栗,是天一觀的道長。 經(jīng)常有香客問我供搀,道長隅居,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任葛虐,我火速辦了婚禮胎源,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屿脐。我一直安慰自己涕蚤,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布的诵。 她就那樣靜靜地躺著万栅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奢驯。 梳的紋絲不亂的頭發(fā)上申钩,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音瘪阁,去河邊找鬼撒遣。 笑死,一個胖子當著我的面吹牛管跺,可吹牛的內(nèi)容都是我干的义黎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼豁跑,長吁一口氣:“原來是場噩夢啊……” “哼廉涕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤狐蜕,失蹤者是張志新(化名)和其女友劉穎宠纯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體层释,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡婆瓜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了贡羔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廉白。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乖寒,靈堂內(nèi)的尸體忽然破棺而出猴蹂,到底是詐尸還是另有隱情,我是刑警寧澤楣嘁,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布磅轻,位于F島的核電站,受9級特大地震影響马澈,放射性物質(zhì)發(fā)生泄漏瓢省。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一痊班、第九天 我趴在偏房一處隱蔽的房頂上張望勤婚。 院中可真熱鬧,春花似錦涤伐、人聲如沸馒胆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祝迂。三九已至,卻和暖如春器净,著一層夾襖步出監(jiān)牢的瞬間型雳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工山害, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纠俭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓浪慌,卻偏偏與公主長得像冤荆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子权纤,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容