django查詢優化及ajax編碼格式下發送數據 總結

orm查詢優化

1)only與referhtml

​ only方法返回的是一個queryset對象,本質就是列表套數據對象前端

​ 該對象內只含有only括號所指定的屬性(其餘屬性也能夠獲取,可是須要從新走數據庫查詢)ajax

defer與only互爲反關係,返回的是一個queryset對象,本質就是列表套數據對象;該對象只含有除了defer括號內所指定的屬性(括號內的屬性也能夠獲取可是須要從新走數據庫)數據庫

2)select_related與prefetch_relateddjango

select_related括號內只能放外鍵字段,而且外鍵字段的類型只能是一對一或一對多,內部是聯表操做,會將外鍵關聯的表與當前表直接拼接起來,而後再執行查詢操做,返回的結果也是一個queryset,列表套數據對象,該數據對象獲取當前表中的數據或者關聯表中的數據,都不會再走數據庫;json

prefetch_related 括號內外鍵字段所有支持,內部是子查詢,返回的結果也是一個queryset對象,列表套數據對象,該數據對象獲取當前表中的數據或者關聯表中的數據,都不會再走數據庫;後端

第一個方法耗時主要耗在聯表操做,第二個方法耗時主要耗在查詢次數;瀏覽器

choices字段

用在一些字段數據是能夠明確列出全部的可能的;好比:性別,工做經驗,學歷,婚否,客戶來源等;app

1.先定義好對應關係;2.在經過字段的choices參數來指定關係。異步

gender_choices = (
​ (1,'male'),
​ (2,'female'),
​ (3,'others'),
)
gender = models.IntegerField(choices = gender_choices)
若是數據在你事先定義好的範圍內,能夠經過get_字段名_display()拿到對應的解釋信息。

ajax

  1. 異步提交 2.局部刷新

ajax基本語法結構
現用的是基於JQuery封裝好的ajax,因此用ajax的時候,先導入jQuery;

$.ajax({
    url:'', # 後端的地址,特性跟action一直,三種狀況
    type:'post', # 請求方式,小寫
    data:{'username':'zhang',password:'123'}, # 提交的數據
    success:function(data){ # data異步提交的結果
        # 回調機制返回的結果
        # window.location.href = url
    }
})
#基於ajax作數據交互,後端不管返回什麼結果都會被回調函數捕獲,不會再影響整個頁面

先後端數據傳輸編碼格式

urlencoded
    數據格式username=zhang&password=123
    django針對符合urlencoded編碼格式的數據,會自動解析並放到request.POST中;
    
formdata
    form表單發送文件必需要指定的編碼格式
    該編碼格式既能夠發文件也能夠發普通的鍵值對
    
    django後端自動識別,將內部符合urlencoded編碼格式的數據,自動解析並將文件類型的數據解析封裝到request.FILES中
    
application/json
    ajax能夠發送json格式的數據,form表單不支持
#注意:數據類型和編碼格式要保證一致性

ajax如何發送json格式的數據

  1. 須要在前端新增一個參數
    contentType:'application/json'

  2. 須要將數據序列化成json格式的字符串

    JSON.stringfy({'username':'zhang','password':'123'})
    注意:django後端針對json格式的數據,不會作任何處理,原封不動的在放request.body內

ajax發送文件(不僅僅能夠發送文件,也能夠發送普通鍵值對)

建議藉助原生js的內置對象幫你作數據攜帶
1).先生成一個內置對象
var MyFormData = new FormData();

2).而後朝該對象內添加數據(普通鍵值對和文件都可)

#普通鍵值對
MyFormData.append('name','value')
MyFormData.append('name1','value1')
MyFormData.append('name2','value2')

#文件數據
如何獲取input文件標籤內文件數據
var MyFileobj = $("input[type='file']")[0].files[0];

3.須要額外指定兩個參數
contentType:false, # 不指定任何編碼,對象自帶編碼 django可以識別;
processData:false, # 瀏覽器不須要對數據進行任何處理

#django可以識別對象中的普通的鍵值對和文件對象,而後分別放到不一樣的方法POST和FILES中;

相關文章
相關標籤/搜索