• django查询优化及ajax编码格式下发送数据 总结


    orm查询优化

    1)only与refer

    ​ only方法返回的是一个queryset对象,本质就是列表套数据对象

    ​ 该对象内只含有only括号所指定的属性(其他属性也可以获取,但是需要重新走数据库查询)

    defer与only互为反关系,返回的是一个queryset对象,本质就是列表套数据对象;该对象只含有除了defer括号内所指定的属性(括号内的属性也可以获取但是需要重新走数据库)

    2)select_related与prefetch_related

    select_related括号内只能放外键字段,并且外键字段的类型只能是一对一或一对多,内部是联表操作,会将外键关联的表与当前表直接拼接起来,然后再执行查询操作,返回的结果也是一个queryset,列表套数据对象,该数据对象获取当前表中的数据或者关联表中的数据,都不会再走数据库;

    prefetch_related 括号内外键字段全部支持,内部是子查询,返回的结果也是一个queryset对象,列表套数据对象,该数据对象获取当前表中的数据或者关联表中的数据,都不会再走数据库;

    第一个方法耗时主要耗在联表操作,第二个方法耗时主要耗在查询次数;

    choices字段

    用在一些字段数据是可以明确列出所有的可能的;比如:性别,工作经验,学历,婚否,客户来源等;

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

  • 相关阅读:
    [PA2014]Muzeum
    [TJOI2015]概率论
    To Do List
    【洛谷4172】 [WC2006]水管局长(LCT)
    HNOI2019退役记
    hdu 2159 FATE
    USACO 2019 January Contest, Platinum 题解
    luogu4774 [NOI2018]屠龙勇士
    NOI 2019游记
    loj #3145. 「APIO 2019」桥梁
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/11972843.html
Copyright © 2020-2023  润新知