day57
目录
日志文件
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
OMR查询优化
only和defer
def defer(self, *fields):
models.UserInfo.objects.defer('username','id')
或
models.UserInfo.objects.filter(...).defer('username','id')
#映射中排除某列数据
def only(self, *fields):
#仅取某个表中的数据
models.UserInfo.objects.only('username','id')
或
models.UserInfo.objects.filter(...).only('username','id')
select_related与prefetch_related
user_list = models.UserInfo.objects.all().select_related('FK字段')
# 表之间进行join连表操作,一次性获取关联的数据
# select_related主要针对一对一和多对一关系进行优化
# select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能
user_list = models.UserInfo.objects.all().prefetcht_related('FK字段')
# 多表连表擦操作时速度会慢,使用其执行多次SQL查询在python代码中实现连表操作
# 对于多对多字段和多对一字段,可以使用prefetcht_related()来进行优化
# prefetcht_related()的优化方式是分别查询每个表,然后用python处理他们之间的关系
MTV和MVC模型
MTV:
- M:models
- T:templates
- V:views
MVC:
- M:models
- V:views
- C:controllar(路由匹配)
- MVC的本质还是MTV
choice参数
gender_choices = (
(1,'男'),
(2,'女'),
(3,'其他'),
)
gender = models.IntegerField(choices=gender_choices)
get_fieldname_display # 获取choise字段的值
# 无论存的数字在不在对应关系中,都可以正常存取(取到数字)
Ajax
Asynchronous(异步) Javascript And XML
XML
XML也是一门标记语言
应用场景:
- 写配置文件
- 可以写前端页面(odoo框架 erp,odoo框架内部功能实现全部依赖于python2)
Ajax可以只刷新页面局部
当请求发出后,浏览器还可以进行其他操作,无需等待服务器的响应
Ajax基本语法结构
$.ajax({
//记得加大括号
})
$.ajax({
url:'', // 数据提交的后端地址 不写就是往当前页面提交 也可以写后缀 也可以写全称 跟actions一样
type:'post', // 提交方式 默认是get请求
data:{'i1':$('#d1').val(),'i2':$('#d2').val()}, // 提交的数据
success:function (data) { // 形参data就是异步提交之后后端返回结果
$('#d3').val(data) // 回调机制需要做的事情
}
})
前后端传输数据编码格式
前后端交互是一个数据编码格式,针对不同的数据我,后端会进行不同的处理
- a标签href参数:get
- form表单:get/post
- ajax:get/post
request.POST
request.GET
request.FILES
# 三种格式
urlencoded
formdata
application/json
- form表单默认的编码方式是urlencoded,对应的数据格式username=jason&password=123,django中会自动解析,并封装到POST中
- form表单发送文件编码格式Content-type:multipart/formdata,针对formdata格式的数据,在浏览器上是无法查看到的;Django后端只要数据满足urlencoded格式,就会自动帮你解析到request.POST中;如果是文件对象,Django后端也会自动识别并封装到request.FILES中
- form表单无法发送json格式的数据,只能借助于ajax
- ajax能发送urlencoded、formdata、application/json三种格式数据;ajax默认的编码格式是urlencoded,Django后端也是将数据解析到request.POST中
Ajax传输json格式数据
Django后端针对json格式的数据,不会做任何处理,只会放到request.body中,需要手动处理
$('#d1').click(function () {
$.ajax({
url:'',
type:'post',
contentType:'application/json', # 1.注意点1
data:JSON.stringify({'username':'jason','password':'123'}), # 2.注意点2
success:function (data) {
alert(123)
}
})
})
Ajax传输文件数据
借助于内置对象 new,该对象既可以携带文件数据,也支持普通的键值对
$('#d1').click(function () {
// 先生成一个内置对象
var MyFormData = new FormData();
// 1. 先添加普通的键值
MyFormData.append('username','jason'); // 添加了一组普通的简直对
MyFormData.append('password','123');
// 2. 添加文件数据
MyFormData.append('myfile',$('#d2')[0].files[0]); // 如何获取input框中文件对象$('#d1')[0].files[0]
$.ajax({
url:'',
type:'post',
data:MyFormData, # 1
// 发送文件必须要指定的两个参数
contentType:false, // 不适用任何编码 MyFormData对象内部自带编码 django后端能够识别 # 2
processData:false, // 不要处理数据 # 3
success:function (data) {
}
})
})
序列化
序列化的目的:将数据整合成一个大字典,方便数据的交互
from app01 import models
from django.core import serializers
def zzz(request):
user_queryset = models.User.objects.all()
res = serializers.serialize('json',user_queryset)
return HttpResponse(res)
浙公网安备 33010602011771号