教育機(jī)構(gòu)電商網(wǎng)站建設(shè)加盟福州seo招聘
文章目錄
- 一、choices參數(shù)
- choices參數(shù)的用法
- choices 參數(shù)用法總結(jié)
- 二、MVC與MTV模式
- 1.MVC
- 2.MTV
- 三、多對(duì)多的三種創(chuàng)建方式
- 1.全自動(dòng)創(chuàng)建
- 2.純手動(dòng)創(chuàng)建
- 半自動(dòng)創(chuàng)建
- 四、Django與Ajax
- 1.什么是Ajax
- 常見的場(chǎng)景
- Ajax案例
一、choices參數(shù)
在沒有用到choices參數(shù)之前,我們?cè)贒jango ORM創(chuàng)建表類中的字段是不是下面這樣的
# 舉例這是一張用戶基本信息表
class UserInfo(models.Model):username = CharField(max_length=32)age = IntegerField() # 整型字段不要傳max_length參數(shù)哦----特別注意gender = CharField(max_length=2)# 用戶性別
通過上面的userinfo表,我們是否可以想一下,在用戶性別字段中,人類的性別好像只有兩種表示方式,男/女,那這樣,我們?nèi)绻?00萬條用戶信息,而這100萬條用戶的性別分別有50萬男性和50萬女性。
這個(gè)時(shí)候,就造成了問題,既然我們這個(gè)字段的描述信息,只需要兩種描述就能完成這個(gè)用戶字段在性別的描述,我們?yōu)槭裁床幌胍环N方便簡(jiǎn)潔的形式去描述每一個(gè)用戶的性別呢?
這時(shí)候就可以用到choices參數(shù)
我們依然使用數(shù)字來記錄gender這個(gè)用戶性別字段的描述,大家學(xué)過數(shù)據(jù)庫就知道,能用整型存儲(chǔ)的信息,為什么要用字符型呢?很明顯,是因?yàn)檎捅茸址驼嫉目臻g小。注意:并不是所有的這種僅僅用幾個(gè)描述就能完成隊(duì)大量數(shù)據(jù)的描述,都去用數(shù)字的,此處只是用gender字段為例!!
choices參數(shù)的概念:它是一種以列表 / 元組的型式,里面嵌套著少數(shù)幾個(gè)小元組的方式,表示一種對(duì)應(yīng)關(guān)系
choices參數(shù)的用法
針對(duì)上述的用戶信息表我們做以下修改:將用戶性別用整型去記錄
# 創(chuàng)建userinfo表
class UserInfo(models.Model):username = models.CharField(max_length=32)age = models.IntegerField()# 在此處我們用到choices參數(shù)# 先定義一個(gè)chocies參數(shù)的對(duì)應(yīng)關(guān)系/其是就相當(dāng)于是代表數(shù)字的說明與介紹choices_gender = ((1, '男'),(2, '女'),)# 以上定義的choices列表就是下面gender字段的choices參數(shù)對(duì)應(yīng)的一個(gè)對(duì)應(yīng)關(guān)系,此處choices這個(gè)列表,也可以寫成元組的形式,根據(jù)個(gè)人愛好# 在我們將性別字設(shè)置成IntegerField類對(duì)象的時(shí)候,將它的choices參數(shù)設(shè)置為我們上面定義的choices列表gender = models.IntegerField(max_length=2,choices = choices_gender)
提問:如果我們向這個(gè)表中的gender字段存的值不在我們定義的choices列表中會(huì)怎么樣呢?
# 向表中插入幾條數(shù)據(jù)
models.UserInfo.objects.create(username='jack',age=18,gender=1)
models.UserInfo.objects.create(username='jerry',age=18,gender=2)
models.UserInfo.objects.create(username='tank',age=18,gender=3)
總結(jié):如果存的數(shù)字是choices列表中的數(shù)字可以存進(jìn)userinfo表,存的數(shù)字不在choices列表中對(duì)應(yīng)關(guān)系中,也可以存
# 現(xiàn)在我們來查一下這張表中用戶對(duì)應(yīng)的gender字段的值。
user_obj_list = models.UserInfo.objects.all()for user_obj in user_obj_list:print(f'{user_obj.username}---{user_obj.age}---{user_obj.get_gender_display}')
choices 參數(shù)用法總結(jié)
- 在定義choices這個(gè)對(duì)應(yīng)關(guān)系的時(shí)候,可以用列表套元組,可以用字典套元組,隨意,看自己心情
- 自定義的這個(gè)對(duì)應(yīng)關(guān)系的變量名(choices可以換別的)看你心情
- 在往表中存數(shù)據(jù)時(shí),不管是不是對(duì)應(yīng)關(guān)系中的內(nèi)容,都可以往表中存
- 在查詢使用choces參數(shù)的這個(gè)字段時(shí),想要查詢這個(gè)字段的值必須用get_字段名_display()才能獲取到正確的對(duì)應(yīng)內(nèi)容
- 固定句式 數(shù)據(jù)對(duì)象.get_字段名_display() 當(dāng)沒有對(duì)應(yīng)關(guān)系的時(shí)候 該句式獲取到的還是數(shù)字
二、MVC與MTV模式
1.MVC
Web服務(wù)器開發(fā)領(lǐng)域里著名的MVC模式,所謂MVC就是把Web應(yīng)用分為模型(M),控制器?和視圖(V)三層,他們之間以一種插件式的、松耦合的方式連接在一起,模型負(fù)責(zé)業(yè)務(wù)對(duì)象與數(shù)據(jù)庫的映射(ORM),視圖負(fù)責(zé)與用戶的交互(頁面),控制器接受用戶的輸入調(diào)用模型和視圖完成用戶的請(qǐng)求,其示意圖如下所示:
2.MTV
Django的MTV模式本質(zhì)上和MVC是一樣的,也是為了各組件間保持松耦合關(guān)系,只是定義上有些許不同,Django的MTV分別是值:
● M 代表模型(Model): 負(fù)責(zé)業(yè)務(wù)對(duì)象和數(shù)據(jù)庫的關(guān)系映射(ORM)。
● T 代表模板 (Template):負(fù)責(zé)如何把頁面展示給用戶(html)。
● V 代表視圖(View): 負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)時(shí)候調(diào)用Model和Template。
除了以上三層之外,還需要一個(gè)URL分發(fā)器,它的作用是將一個(gè)個(gè)URL的頁面請(qǐng)求分發(fā)給不同的View處理,View再調(diào)用相應(yīng)的Model和Template,MTV的響應(yīng)模式如下所示:
一般是用戶通過瀏覽器向我們的服務(wù)器發(fā)起一個(gè)請(qǐng)求(request),這個(gè)請(qǐng)求回去訪問視圖函數(shù),(如果不涉及到數(shù)據(jù)調(diào)用,那么這個(gè)時(shí)候視圖函數(shù)返回一個(gè)模板也就是一個(gè)網(wǎng)頁給用戶),視圖函數(shù)調(diào)用模型,模型去數(shù)據(jù)庫查找數(shù)據(jù),然后逐級(jí)返回,視圖函數(shù)把返回的數(shù)據(jù)填充到模板中空格中,最后返回網(wǎng)頁給用戶。
三、多對(duì)多的三種創(chuàng)建方式
注意:多對(duì)多關(guān)系這種虛擬外鍵才有add、set、clear、remove,一對(duì)一和一對(duì)多的表是無法使用的
1.全自動(dòng)創(chuàng)建
class Book(models.Model):title = models.CharField(max_length=32)authors=models.ManyToManyField(to='Author')
class Author(models.Model):name = models.CharField(max_length=32)
優(yōu)勢(shì):自動(dòng)創(chuàng)建第三張表,并且提供了add、remove、set、clear四種操作
劣勢(shì):第三張表無法創(chuàng)建更多的字段,擴(kuò)展性較差。如果我們有一些業(yè)務(wù)邏輯就是在關(guān)系表上,我們就無法通過第三張表完成了。
2.純手動(dòng)創(chuàng)建
class Book(models.Model):title = models.CharField(max_length=32)
class Author(models.Model):name = models.CharField(max_length=32)
class Book2Author(models.Model):book=models.ForeignKey(to='Book')author= models.ForeigKey(to='Author')others=models.CharField(max_length=32)join_time = models.DataField(auto_now_add=True)
優(yōu)勢(shì):第三張表完全由自己創(chuàng)建,擴(kuò)展性強(qiáng)
劣勢(shì):編寫繁瑣,并不支持add、remove、set、clear以及正反向概念
半自動(dòng)創(chuàng)建
class Book(models.Model):title = models.CharField(max_length=32)authors = models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author')# 外鍵在哪個(gè)表就把book表放前面)
class Author(models.Model):name = models.CharField(max_length=32)
class Book2Author(models.Model):book = models.ForeignKey(to='Book', on_delete=models.CASCADE)author = models.ForeignKey(to='Author', on_delete=models.CASCADE)others = models.CharField(max_length=32)join_time = models.DateField(auto_now_add=True)
優(yōu)勢(shì):第三張表完全由自己創(chuàng)建的,擴(kuò)展性強(qiáng),正反向概念依然可以使用
劣勢(shì):編寫繁瑣不再支持add、remove、set、clear
四、Django與Ajax
1.什么是Ajax
AJAX(Asynchronous Javascript And XML)翻譯成中文就是“異步的Javascript和XML”。即使用Javascript語言與服務(wù)器進(jìn)行異步交互,傳輸?shù)臄?shù)據(jù)為XML(當(dāng)然,傳輸?shù)臄?shù)據(jù)不只是XML)。ajax不是一門新的技術(shù),而是一種使用現(xiàn)有標(biāo)準(zhǔn)的新方法。它本身又很多版本,我們目前學(xué)習(xí)的是jQuery版本(版本無所謂,本質(zhì)一樣就可以)。
功能介紹:異步提交、局部刷新
優(yōu)點(diǎn):
不重新加載整個(gè)頁面的情況下,可以跟服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁內(nèi)容。(客戶是感覺不到的),只需要用戶允許JavaScript在瀏覽器上執(zhí)行。
1.AJAX使用JavaScript技術(shù)向服務(wù)器發(fā)送異步請(qǐng)求;
2.AJAX請(qǐng)求無需刷新整個(gè)頁面
3.因?yàn)榉?wù)器響應(yīng)內(nèi)容不再是整個(gè)頁面,而是頁面中的部分內(nèi)容,所以AJAX性能高;
4.兩個(gè)關(guān)鍵點(diǎn):異步請(qǐng)求,局部刷新
常見的場(chǎng)景
搜索引擎會(huì)根據(jù)用戶輸入的關(guān)鍵字,自動(dòng)提示檢索關(guān)鍵字。其實(shí)這里就使用了AJAX技術(shù)!當(dāng)文件框發(fā)生了輸入變化時(shí),使用AJAX技術(shù)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,然后服務(wù)器會(huì)把查詢到的結(jié)果響應(yīng)給瀏覽器,最后再把后端返回的結(jié)果展示出來。
這注冊(cè)過程頁面時(shí)沒有刷新的,只是刷新頁面中我們鼠標(biāo)點(diǎn)擊的局部位置,當(dāng)請(qǐng)求發(fā)出后,瀏覽器還可以進(jìn)行其他操作,無需等待服務(wù)器的響應(yīng)。
Ajax案例
我們來做一個(gè)計(jì)算的例子
ajax.html
<body>
<input type="text" id="inp1">+
<input type="text" id="inp2">=
<input type="text" id="inp3">
<button class="btn">提交</button><script>$('.btn').click(function () { //把提交按鈕綁定一個(gè)點(diǎn)擊事件var inp1 = $("#inp1").val();var inp2 = $("#inp2").val();//把獲取到的兩個(gè)值提交到后端,讓python來計(jì)算兩個(gè)值,然后返回$.ajax({url: "", //默認(rèn)不寫是當(dāng)前地址type: 'post', //提交方式,默認(rèn)是getdata: {inp1: inp1, inp2: inp2}, //朝后端提交的數(shù)據(jù),KV鍵值對(duì)形式//回調(diào)函數(shù)success用來接受后端返回的數(shù)據(jù)success:function (res){console.log(res) //打印后端返回的數(shù)據(jù)$('#inp3').val(res) //將接受到的數(shù)據(jù)返回到inp3中}})})
</script>
</body>
views.py
from django.shortcuts import render, HttpResponse
import json# Create your views here.def ajax(request):if request.method == 'POST':'''接受ajax提交過來的數(shù)據(jù)'''d1 = request.POST.get('inp1')d2 = request.POST.get('inp2')d3 = int(d1) + int(d2) # 轉(zhuǎn)為整型,計(jì)算值print(request.POST) # <QueryDict: {'inp1': ['1'], 'inp2': ['1']}>return HttpResponse(json.dumps(d3)) # 序列化并返回給前端return render(request, 'ajax.html')
這個(gè)時(shí)候需要拿到后端字典里的數(shù)據(jù)要怎么做
ajax.html
<script>$('.btn').click(function () { //把提交按鈕綁定一個(gè)點(diǎn)擊事件var inp1 = $("#inp1").val();var inp2 = $("#inp2").val();//把獲取到的兩個(gè)值提交到后端,讓python來計(jì)算兩個(gè)值,然后返回$.ajax({url: "", //默認(rèn)不寫是當(dāng)前地址type: 'post', //提交方式,默認(rèn)是getdata: {inp1: inp1, inp2: inp2}, //朝后端提交的數(shù)據(jù),KV鍵值對(duì)形式//回調(diào)函數(shù)success用來接受后端返回的數(shù)據(jù)success:function (res){console.log(res) //打印后端返回的數(shù)據(jù){#res=JSON.parse(res) //反序列化json格式數(shù)據(jù),如果后端是用JsonResponse返回?cái)?shù)據(jù)就不需要前端反序列化#}console.log(res.username)console.log(res.password) //前度想要拿到某個(gè)值就需要反序列化,后端別忘了序列化}})})
</script>
views.py
from django.shortcuts import render, HttpResponse
import json
from django.http import JsonResponse# Create your views here.def ajax(request):if request.method == 'POST':'''接受ajax提交過來的數(shù)據(jù)'''user_dic = {'username':'jack','password':123}return JsonResponse(user_dic) # 序列化并返回給前端return render(request, 'ajax.html')