django與使用者進行互動,頁面一旦關閉,或伺服器重新開機,一切都将回到原始狀态。
是以需要使用資料庫對使用者操作資料進行儲存,Django通過自帶的ORM架構操作資料庫,并且原生支援輕量級的sqlite3資料庫。
1.django使用mysql配置
需要安裝安裝資料庫驅動mysqlclient
pip install mysqlclient
如果使用其他資料庫,需要自己進行settings.py中進行配置。mysql的配置如下:
# DATABASES = {
# # 'default': {
# # 'ENGINE': 'django.db.backends.sqlite3',
# # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# # }
# # }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',#資料庫引擎
'NAME': 'django_test',#資料庫名稱,需要自己手動建立,django不會主動為你建立
'USER': 'root', #資料庫使用者名
'PASSWORD': 'talent', #資料庫密碼
'HOST':'localhost', #資料庫主機ip位址
'PORT':'3306', #mysql使用的端口号
}
}
2.django與mysql互動
(1)建立資料庫的表類,類名代表了資料庫表名,且繼承了models.Model,類裡面的字段代表資料表中的字段
(2)對資料庫表進行同步操作,python manage.py makemigrations,python manage.py migrate
(3)使用資料庫表類,進行資料庫的增删改查操作。
3.字段類型-參數詳解
django的models裡面字段類型除了上面的常用的 models.CharField和models.IntegerField,還有更多的類型
1、models.AutoField 自增列= int(11)
如果沒有的話,預設會生成一個名稱為 id 的列,如果要顯示的自定義一個自增列,必須将給列設定為主鍵 primary_key=True。
2、models.CharField 字元串字段
必須 max_length 參數
3、models.BooleanField 布爾類型=tinyint(1)
不能為空,Blank=True
4、models.ComaSeparatedIntegerField 用逗号分割的數字=varchar
繼承CharField,是以必須 max_lenght 參數
5、models.DateField 日期類型 date
對于參數,auto_now =True則每次更新都會更新這個時間;auto_now_add 則隻是第一次建立添加,之後的更新不再改變。
6、models.DateTimeField 日期類型 datetime
同DateField的參數
7、models.Decimal 十進制小數類型= decimal
必須指定整數位max_digits和小數位decimal_places
8、models.EmailField 字元串類型(正規表達式郵箱)=varchar
對字元串進行正規表達式
9、models.FloatField 浮點類型= double
10、models.IntegerField 整形
11、models.BigIntegerField 長整形
integer_field_ranges ={
'SmallIntegerField':(-32768,32767),
'IntegerField':(-2147483648,2147483647),
'BigIntegerField':(-9223372036854775808,9223372036854775807),
'PositiveSmallIntegerField':(0,32767),
'PositiveIntegerField':(0,2147483647),
}
12、models.IPAddressField 字元串類型(ip4正規表達式)
13、models.GenericIPAddressField 字元串類型(ip4和ip6是可選的)
參數protocol可以是:both、ipv4、ipv6
驗證時,會根據設定報錯
14、models.NullBooleanField 允許為空的布爾類型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 減号、下劃線、字母、數字
18、models.SmallIntegerField 數字
資料庫中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字元串=longtext
20、models.TimeField 時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字元串,位址正規表達式
22、models.BinaryField 二進制
23、models.ImageField圖檔
24、models.FilePathField檔案
對應的字段參數如下:
1、null=True
資料庫中字段是否可以為空
2、blank=True
django的 Admin 中添加資料時是否可允許空值
3、primary_key = False
主鍵,對AutoField設定主鍵後,就會代替原來的自增 id 列
4、auto_now 和 auto_now_add
auto_now 自動建立---無論添加或修改,都是目前操作的時間
auto_now_add 自動建立---永遠是建立時的時間
5、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default 預設值
8、verbose_name Admin中字段的顯示名稱
9、name|db_column 資料庫中的字段名稱
10、unique=True 不允許重複
11、db_index = True 資料庫索引
12、editable=True 在Admin裡是否可編輯
13、error_messages=None 錯誤提示
14、auto_created=False 自動建立
15、help_text 在Admin中提示幫助資訊
16、validators=[]
17、upload-to
4.實際使用
建立資料庫表類,執行同步操作後,可以從資料庫表中看到表新增成功了,預設多一個字段id為主鍵
如果要使用某個字段作為主鍵,隻需要增加字段參數primary_key =True
1.新增hero資料表類
class Hero(models.Model):
name = models.CharField(max_length=30)
propertys = models.CharField(max_length=30)
is_male = models.BooleanField(null=False)
power = models.IntegerField(default=1)
2.添加url規則
url(r'hero',views.hero),
3.templates檔案hero.html
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Hero頁面</title>
</head>
<body>
<h1>使用者輸入:</h1>
<form action="/hero/" method="post">
英雄 名:<input type="text" name="name"/><br/>
英雄屬性:<input type="text" name="propertys"/><br/>
是否男性:<input type="text" name="is_male"/><br/>
武力 值:<input type="text" name="power"/><br/>
<input type="submit" value="送出"/>
</form>
<h1>英雄展示:</h1>
<table >
<thead>
<tr>英雄名</tr>
<tr>英雄屬性</tr>
<tr>是否男性</tr>
<tr>武力值</tr>
</thead>
<tbody>
{% for item in data %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.propertys }}</td>
<td>{{ item.is_male}}</td>
<td>{{ item.power }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
4.視圖函數:
def hero(request):
if request.method == 'POST':
name = request.POST.get('name')
propertys = request.POST.get('propertys')
is_male = request.POST.get('is_male')
power = request.POST.get('power')
print(name, propertys, is_male, power, type(name))
hero = Hero(name=name, propertys=propertys, is_male=is_male, power=power)
hero.save()
data = Hero.objects.all()
return render_to_response('hero.html', {'data': data})
實作效果:通路http://127.0.0.1:8000/hero/,
如果資料庫中有資料就從,資料庫中取出全部資料,展示在下方table中,上方可以通過表單送出方式,不斷向資料庫中送出資料

1.新增資料方法
建立資料表執行個體,如
hero = Hero(name=name, propertys=propertys, is_male=is_male, power=power),調用hero.save()方法
注意:建立執行個體時參數必須寫成關鍵字參數形式,不可寫成hero = Hero(name,propertys,is_male,power)形式,django會解析錯誤
2.删除資料
def delete_data(request):
#根據屬性擷取資料,調用delete()方法删除
# hero1 = Hero.objects.get(name = '2')
# hero1.delete()
Hero.objects.filter(id=12).delete()
# Hero.objects.all().delete()#删除所有資料
return HttpResponse("删除資料成功!!")
3.修改資料
def update_data(request):
# 1.根據屬性查詢到資料後,對屬性進行修改,然後調用save方法儲存
hero = Hero.objects.get(name='提莫')
hero.power = 100
hero.save()
# 2.根據屬性查詢到資料後,直接調用update()方法
Hero.objects.filter(name="德瑪").update(name='諾克薩斯')
# 3.調用all方法的update方法
Hero.objects.all().update(is_male=False)
return HttpResponse("修改成功")
4.查詢資料
def qury_data(request):
# get方法查詢可以傳遞多個參數進行限制,查詢結果隻能是一個,限制條件如果不唯一,會報錯
hero = Hero.objects.get(name='提莫')#傳回是一個執行個體對象,<class 'hello.models.Hero'>
print(type(hero))
power_qury = Hero.objects.filter(name='德瑪', is_male=False)#根據條件過濾,可傳回多個
print(type(power_qury))#<class 'django.db.models.query.QuerySet'>
power = power_qury[0].power
all_hero = Hero.objects.all()#查詢所有
for i in all_hero:
print(i.name)
order_by = Hero.objects.order_by("name")
for i in order_by:
print(i.name)
#查詢結果可以進行切片操作Hero.objects.order_by("name")[0:2],相當于limit 2
return HttpResponse("<h1>%s</h1>" % power)
5.查詢方法詳解
查詢方法有很多,根據傳回結果分類
- 傳回對象是對象清單的: all(), filter(), exclude(), order_by(), reverse(), values(), values_list(), distinct()
- 傳回結果是對象: get(), first(), last()
- 傳回結果是布爾值: exists()
- 傳回數字: count()
傳回對象清單即queryset序列,可以通過for循環進行擷取每一個對象,然後使用對象調用對應的屬性。也可以通過下标取某個對象,然後調用對應的屬性。使用切片操作也可以擷取其中某幾個對象。
傳回對象的可以直接調用對應的屬性和方法。
values函數,可以由queryset序列調用values函數,傳回值是一個字典
result=Hero.objects.all().values("name","power")
for r in result:
print(r)
傳回結果:
{'name': '諾克薩斯', 'power': 10}
{'name': '劍聖', 'power': 20}
{'name': '諾克薩斯', 'power': 20}
{'name': '提莫', 'power': 100}
exclude() 它包含了與所給篩選條件不比對的對象 調用者:objects管理器 傳回queryset
result2 = Hero.objects.exclude(name = "諾克薩斯")
for r in result2:
print(r.name)
傳回的是name不等于諾克薩斯的對象集合
劍聖
提莫
order_by() 對查詢結果排序 由queryset對象調用,傳回值是queryset,預設升序,前面加個-是代表降序
ret=Hero.objects.all().order_by("-power")
根據power值降序排列
reverse() 對查詢結果反向排序 由queryset對象調用,傳回值是queryset
ret=Hero.objects.all().order_by("-power").reverse()
values_list() 由queryset對象調用, 傳回值是queryset 一個元組序列
ret=Hero.objects.all().values_list("name", "power")
distinct() 從傳回結果中剔除重複紀錄 由queryset對象調用,傳回值是queryset
ret=Hero.objects.all().values("name", "power").distinct()
first(),last()方法: 傳回第一條記錄和傳回最後一條記錄 調用者:queryset 傳回model對象
fir = Hero.objects.all().order_by("name").first()
exists() 如果QuerySet包含資料,就傳回True,否則傳回False 由queryset對象調用 傳回值布爾值
is_exist=Hero.objects.all().exists()
count : 數數 由queryset對象調用 傳回int
et=Hero.objects.all().count()