• day55 Ajax


    orm相关的数据库查询优化

    only与defer

    ​ only括号内放字段,查询结果是一个列表套一个个数据对象
    ​ 这些数据对象点括号内的字段属性不会再查询数据库,直接就是对象获取属性
    ​ 也支持括号内没有的字段,但是每次点击就会重新走一次数据库查询,效率极低。

    ​ defer与only是互为反操作
    ​ defer括号内放什么字段,查询出来的对象就没有该字段属性
    ​ 如果要点击,每次点击一次就要重新走一次数据库查询
    ​ 如果点击括号之外的字段,就不会走数据库,仅仅是对象属性的操作

    '''惰性查询:减少不必要的数据库操作,降低数据库的压力
        能少走一次数据库就少走一次'''
    #only
    res=models.Book.objects.only('title')
        print(res)
        for i in res:
            print(i.title)
            print(i.price)
    #defer
    res=models.Book.objects.defer('title')
         print(res)
            for i in res:
                print(i.title)
                print(i.price)
    
    	select_related括号内只能放外键字段,并且外键字段的类型只能是一对多 一对一  不能是多对多
    内部操作是自动联表操作,会将括号内外键字段所关联的表,与当前表自动拼接成一张表
    然后将表中的数据一个个查询出来封装成一个个的对象
        好处:跨表也不需要重复走数据库了,减轻数据库的压力
        select_related括号内可以放多个外键字段 用逗号隔开 会将对个外键字段关联的表与当前表全部平常一张大表
        耗时:数据库层面需要先联表
    

    ​ prefetch_related内部是子查询
    ​ 会自动帮你按步骤查询多张表 然后将查询的结果封装到对象中
    ​ 给用户的感觉好像还是连表操作
    ​ 括号内支持传多个外键字段 并且没有类型限制
    ​ 特点:每放一个外键字段 就会多走一条sql语句 多查询一张表
    ​ 耗时:查询的次数长

    两者之间的优缺点
    结合实际情况 表的大小
    两张表都特别大的情况下 连表操作 可能耗时更多

    #select_related
    res=models.Book.objects.select_related('publish')
        print(res)
        for i in res:
            print(i.title) 
            print(i.publish.addr)
          
     #prefetch_related   
     res=models.Book.objects.prefetch_related('publish','author')
        print(res)
        for i in res:
            print(i.title)
            print(i.publish)      
    

    choices参数

    ​ 用户表
    ​ 性别
    ​ 在职状态
    ​ 学历
    ​ 婚否

    ​ 存数字,取得时候按照提前设计好的对应关系,取出对应的真正的数据
    可以是数字 可以是字符串第一个参数不一定是数字,只要实现定义还对应关系,之后利用固定语法get_字段名_display()就可以获取对应的注释信息

    class User(models.Model):
        username=models.CharField(max_length=64)
        password=models.IntegerField()
        gender_choices=(
            (1,'男'),
            (2,'女'),
            (3,'其他'),
        )
        gender=models.IntegerField(choices=gender_choices)
        '''该字段存数字
        1.如果存储的数字在我们提前定义好的关系中会怎样
        2.如果存储的数字不再关系中会怎么样
            能够正常存在,也能正常获取(数字)'''
       
     user_obj=models.User.objects.get(pk=1)
        user_obj1=models.User.objects.get(pk=4)
        print(user_obj.gender)#1
        print(user_obj1.gender)#4
        print(user_obj.get_gender_display())#男
        print(user_obj1.get_gender_display())#4 没有对应关系,获取的还是数字本身
        '''只要是choices字段类型,在获取值的时候,统一句式
        get_字段名_display()'''
    

    MTV与MVC模型

    django自称为是MTV框架,本质还是MVC

    MTV:models templates views
    MVC: models views controllar(urls.py)

    Ajax简介

    xml也是一门标记语言,该语法应用场景
    1.写配置文件
    2.可以写前端页面(odoo框架 erp)
    每家公司都会有属于这家公司独有的内部管理软件,专门用来开发企业内部管理软件 框架 oodo框架内部功能实现全部依赖与python2

    Ajax最大的优点实在不重新加载页面的情况下,可以与服务器交换数据并更新部分网页内容(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

    <input type="text" id="d1">+<input type="text" id="d2">=<input type="text" id="d3">
    <button id="d4">计算</button>
    <script>
        $('#d4').on('click',function () {
        //获取前面两个框的内容,将数据发给后端
            //开启Ajax语法句式
            $.ajax({
                url:'',//数据提交的后端地址,不写就是往当前页面提交,也可以写后缀 也可以写全称 跟action一样
                type:'post' ,//提交方式 默认get请求
                data:{'i1':$('#d1').val(),'i2':$('#d2').val()},//提交的数据
                success:function (data) {//形参data就是异步提交之后后端返回的结果
                    $('#d3').val(data)
                }//一旦用了Ajax,必知必会三板斧都不再作用域页面,而是与data交互
            })
        })
    </script>
    
    def xxx(request):
        print(request.is_ajax())#判断当前请求是否是Ajax请求
        print(request.POST)#Ajax发送的post请求,普通的键值对也在request.POST中获取
        if request.is_ajax():
            i1=request.POST.get('i1')
            i2=request.POST.get('i2')
            res=int(i1)+int(i2)
            return HttpResponse(res)#给异步回调函数 success
        return render(request,'xxx.html')
    

    前后端传输数据编码格式

    前后端交互是有一个数据编码格式的,针对不同的数据,后端会进行不同的处理
    request.POST
    request.FILES

    编码格式有三种:
    1.urlencoded
    2.formdata
    3.application/json

    1.form表单发送数据的编码格式

    application/x-www-form-urlencoded
    form表单默认的编码方式是urlencoded
    urlencode所对应的数据格式:
    	username=PumpedFoxMover&%27password=24345
    django后端针对urlencoded数据,会自动解析并且帮你封装到request.POST中
    

    2.form表单发送文件的编码格式

    multipart/form-data; boundary=----WebKitFormBoundaryFh7BqbkGAqKJVTdn
    form表单发送文件编码格式:formdata
    针对formdata格式的数据,在浏览器上是查看不到的
    
    django后端只要你的数据满足urlencoded格式:
    	username=PumpedFoxMover&%27password=24345
    就会自动帮你解析到request.POST中,如果是一个文件对象,django后端会自动识别放在request.FILES中
    

    3.form表单无法发送json数据。只能借助ajax

    4.ajax发送数据的编码格式

    ​ ajax能够发送:
    ​ 1.urlencoded
    ​ 2.formdata
    ​ 3.application/json
    ​ 这三种格式数据

    application/x-www-form-urlencoded; charset=UTF-8
    ajax默认的编码格式也是urlencoded,也就意味着后端django也将数据解析到request.POST中
    
    注意:在涉及到前后端交互的时候,一定要做到数据格式和编码格式一致,
    
    <button id="d1">点击ajax</button>
    <script>
        $('#d1').click(function () {
            $.ajax({
                url:'',
                type:'post',
                data:{'username':'jason','password':'123'},
                success:function (data) {
                    alert(123)
                }
            })
        })
    </script>
    

    Ajax如何传输json格式数据

    application/json
    {"username":"jason","password":"123"}
    
    <button id="d1">点击json</button>
    <script>
        $('#d1').click(function () {
            $.ajax({
                url:'',
                type:'post',
                contentType:'application/json',#注意点 默认是urlencoded
                data:JSON.stringify({'username':'jason','password':'123'}),
                success:function (data) {
                    alert(123)
                }
            })
        })
    </script>
    #django后端针对json格式,不会做任何处理,数据怎么来的,只会原封不动的放到request.body中。需要自己手动处理
    
    def yyy(request):
        if request.method=='POST':
            # print(request.POST)#urlencoded
            # print(request.FILES)#formata
            json_bytes=request.body
            # print(str(json_bytes,encoding='utf-8'))
            print(type(json_bytes.decode('utf-8')))#解码
            json_dic=json.loads(json_bytes.decode('utf-8'))#反序列化
            json_dic=json.loads(json_bytes)#自动解码加反序列化
            print(json_dic,type(json_dic))
    
        return render(request,'yyy.html')
    

    Ajax如何传输文件数据

    借助于内置对象 new,该对象既可以携带文件数据,同时也支持普通的键值对

    <form action="">
        username: <input type="text" name="username">
        password: <input type="text" name="'password">
        myfile: <input type="file" name="myfile" id="d2">
    </form>
    <button id="d1">点击文件</button>
    <script>
     $('#d1').click(function () {
            //先生成一个内置对象
            var MyFormData=new FormData();
            //1.先添加普通键值对
            MyFormData.append('username','jason');
            MyFormData.append('password','123');
            MyFormData.append('hobby',['read','run']);
            //2.添加文件数据
            MyFormData.append('myfile',$('#d2')[0].files[0])//如何获取input框中文件对象$('#d2')[0].files[0]
            $.ajax({
                url:'',
                type:'post',
                data:MyFormData,
                //发文件必须要指定的两个参数
                contentType:false,//不适用任何编码,MyFormData对象内部自带编码,django厚度那能够识别
                processData:false,//不要处理数据
                success:function (data) {
                    
                }
            })
        })
    </script>
    
    def yyy(request):
        if request.method=='POST':
            print(request.POST)#urlencoded
            print(request.FILES)#formata
        return render(request,'yyy.html')
    

    序列化

    drf djanfo restframework

    from django.core import serializers
    #序列化的目的:将数据整合成一个大字典形式,方便数据的交互
    def zzz(request):
        user_queryset=models.User.objects.all()
        # [{username:...,password:...,hobby:...}]
        # user_list=[]
        # for data in user_queryset:
        #     user_list.append(
        #         {
        #             'username':data.username,
        #             'password':data.password,
        #             'gender':data.get_gender_display()
        #         }
        #     )
        res=serializers.serialize('json',user_queryset)
        # return HttpResponse(user_list)
        return HttpResponse(res)
    '''
    [{"model": "app01.user", "pk": 1, "fields": {"username": "u5927u82cfu6253", "password": 123, "gender": 1}}, {"model": "app01.user", "pk": 2, "fields": {"username": "u65b9u5f0f", "password": 123, "gender": 2}}, {"model": "app01.user", "pk": 3, "fields": {"username": "u5341u5206u58ebu5927u592b", "password": 123, "gender": 3}}, {"model": "app01.user", "pk": 4, "fields": {"username": "u65f6u53d1u73b0", "password": 123, "gender": 4}}]
    '''
    

    Ajax结合sweetalert实现删除按钮功能

    自定义分页器

    多对多三种建立方式

  • 相关阅读:
    Cryptography I 学习笔记 --- 使用分组密码
    Cryptography I 学习笔记 --- 分组密码
    jQuery动画之自定义动画
    jQuery事件之一次性事件
    jQuery事件之自定义事件
    jQuery事件之解绑事件
    jQuery事件之绑定事件
    jQuery动画之停止动画
    JQuery动画之淡入淡出动画
    jQuery属性操作之值操作
  • 原文地址:https://www.cnblogs.com/zqfzqf/p/11967974.html
Copyright © 2020-2023  润新知