orm查询优化 MTV和MVC模型 字段的chioces参数 Ajax

时间:2019-11-30 00:09:32   收藏:0   阅读:234

一、ORM查询优化

1. all()查询

2. only()/defer()方法

(1)only()方法

(2)defer()方法

res = models.Book.objects.defer('title')
print(res)
for i in res:
   print(i.title)  # 除了最初查询走的那一次,每到这一行都会再走一次数据库进行查询
   print(i.price)  # 只会走最初的那一次,这行不走数据库
res = models.Book.objects.select_related('publish')  # publish为外键字段
print(res)
for i in res:
  print(i.title)  # title为普通字段 , 只是对象点属性获取属性值,不走数据库
  print(i.publish)  # 只是对象点属性获取属性值,不走数据库
res = models.Book.objects.prefetch_related('publish','authors')  # publish 和 authors都是外键字段, publish是一对多的外键字段,authors是多对多的建立第三张表的虚拟外键字段
print(res)
for i in res:
   print(i.title)  # 只是对象点属性获取属性值,不走数据库
   print(i.publish)  # 只是对象点属性获取属性值,不走数据库

(3)select_related()/prefetch_related()的优缺点

二、MTV与MVC模型

1. MTV模型

2. MVC模型

三、chioces参数

# models.py文件中:

class User(models.Model):
    username = models.CharField(max_length=64)
    password = models.IntegerField()
    
    # 自定义chioces参数的值,一个元组就是一个值,元组第一个元素可以为数字,也可以为字符串,以gender字段的字段类型为准。
    gender_choices = (  
        (1,'男'),
        (2,'女'),
        (3,'其他'),
    )
    gender = models.IntegerField(choices=gender_choices)  # chioces参数
    
    
# views.py文件中:    
    
    # 执行插入操作
    models.User.objects.create(username='tank',password=123,gender=1)
    models.User.objects.create(username='nick',password=123,gender=4)  # 可以插入数据成功
    
    # 执行查询操作
    user_obj1 = models.User.objects.filter(username='tank').first()
    user_obj2 = models.User.objects.filter(username='nick').first()
    
    # 打印信息
    print(user_obj1.get_字段名_display())  # 结果是: 男
    print(user_obj2.get_字段名_display())  # 结果是: 4

四、Ajax

1. Ajax语法

(1)起手语法

起手:
$.ajax({
   # 书写代码
            })

(2)Ajax基本语法结构

// 前端代码:

$.ajax({
        url:'',  // 数据提交的后端地址  不写就是往当前页面提交  也可以写后缀 也可以写全称  跟form表单的actions参数一样
        type:'post',  // 提交方式  默认是get请求
        data:{'i1':$('#d1').val(),'i2':$('#d2').val()},  // 提交的数据
        success:function (recv_data) {  // 形参recv_data就是异步提交之后后端返回结果
            $('#d3').val(recv_data)  // 回调机制需要做的事情
           }
        })


// 后端代码:

def xxx(request):
    print(request.is_ajax())  # 判断当前请求是否是ajax请求,打印结果: True
    # 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')  # 给异步回调函数 success
        # return redirect('https://www.baidu.com')  # 给异步回调函数 success
    return render(request,'xxx.html')

五、前端传输数据的编码格式

1. 常见的编码格式

  1. urlencoded
  2. formdata
  3. application/json

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

(1)urlencoded编码格式

(2)formdata编码格式

(3)json格式

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

(1)urlencoded编码格式

(2)formdata编码格式

<scrip>
    // 传文件
    $('#d1').click(function () {
        // 1.先生成一个内置对象
        var MyFormData = new FormData();
        // 2. 先添加普通的键值
        MyFormData.append('username','jason');  // 添加了一组普通的键值对
        MyFormData.append('password','123');
        MyFormData.append('hobby',['read','run']);
        // 3. 添加文件数据
        MyFormData.append('myfile',$('#d2')[0].files[0]);  // 如何获取input框中文件对象$('#d1')[0].files[0]
    
        // ajax基本语法结构
        $.ajax({
            url:'',
            type:'post',
            data:MyFormData,

            // 4. 发送文件必须要指定的两个参数(1)(2)
            contentType:false,  // (1)不适用任何编码  MyFormData对象内部自带编码 django后端能够识别
            processData:false,  // (2)不要处理数据

            success:function (back_data) {
                    alert(back_data)    // 回调机制需要做的事情
            }

        })
    })
    
</scrip>

(3)application/json编码格式

<scrip>
$('#d1').click(function () {
        $.ajax({
            url:'',
            type:'post',
            contentType:'application/json',  // 1.编码格式写法
            data:JSON.stringify({'username':'jason','password':'123'}),  // 2.序列化
            success:function (back_data) {
                alert(back_data)
            }
        })
    })
</scrip>   
# 因为ajax传输过来的json格式的数据是二进制类型的json格式,所以:

# 方式一:
import json
json_data = ajax_data.decode('utf-8')
data = json.loads(json_data)

# 方式二:直接使用json.loads , 他会直接把二进制也一起转。

data = json.loads(ajax_data)

六、后端数据的序列化

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!