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中;

相关文章
相关标签/搜索