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')
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能发送urlencodedformdataapplication/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)

posted on 2019-12-03 15:32  shenblogs  阅读(152)  评论(0)    收藏  举报

导航