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

目录

  • 一、ORM查询优化

    • 1. all()查询
    • 2. only()/defer()方法
      • (1)only()方法
      • (2)defer()方法
    • 3. select_related()/prefetch_related()
      • (1)select_related()
      • (2)prefetch_related()
      • (3)select_related()/prefetch_related()的优缺点
  • 二、MTV与MVC模型
    • 1. MTV模型
    • 2. MVC模型
  • 三、chioces参数
  • 四、Ajax
    • 1. Ajax语法

      • (1)起手语法
      • (2)Ajax基本语法结构
  • 五、前端传输数据的编码格式
    • 1. 常见的编码格式
    • 2. form表单发送数据的编码格式
      • (1)urlencoded编码格式
      • (2)formdata编码格式
      • (3)json格式
    • 3. ajax发送数据的编码格式
      • (1)urlencoded编码格式
      • (2)formdata编码格式
      • (3)application/json编码格式
  • 六、后端数据的序列化

一、ORM查询优化

  • 遵循能少走一次数据库就少走一次,即一次查询操作中能少用SQL查询语句就尽量少用。

1. all()查询

  • 惰性查询 减少不必要的数据库操作 降低数据库的压力
  • res = models.Book.objects.all()
    # 针对这行代码,如果不使用res,则不会执行数据库查询的。
    

2. only()/defer()方法

(1)only()方法

  • only()括号内放字段 查询结果是一个列表套一个个的数据对象,即queryset对象。
  • 这些数据对象点括号内的字段不会再查询数据库,直接就是对象获取属性
  • 也支持点括号内没有的字段,但是每点一次就会重新走一次数据库查询,此时查询效率极低。
  • 实例
    res = models.Book.objects.only('title')
    print(res)
    for i in res:
        print(i.title)  # 只会走最初的那一次,这行不走数据库
        print(i.price)  # 除了最初查询走的那一次,每到这一行都会再走一次数据库进行查询

(2)defer()方法

  • defer()only()是互为反操作
  • defer()括号内放什么字段 查询出来的对象就没有该字段属性
  • 如果你要对象点括号内的字段,每点一次就要重新走一次数据
  • 而你如果点击了非括号内的字段,就不会走数据库,仅仅是对象点属性的操作
  • 实例
res = models.Book.objects.defer('title')
print(res)
for i in res:
   print(i.title)  # 除了最初查询走的那一次,每到这一行都会再走一次数据库进行查询
   print(i.price)  # 只会走最初的那一次,这行不走数据库

3. select_related()/prefetch_related()

(1)select_related()

  • select_related原理是联表查询
  • select_related括号内只能放外键字段 并且外键字段的类型只能是一对多 或者 一对一 不能是多对多
  • 内部是自动联表操作,会将括号内外键字段所关联的表,与当前表自动拼接成一张表
  • 然后将表中的数据一个个查询出来封装成一个个的对象,这样做的好处就在于跨表也不需要重复的走数据库了,减轻数据库的压力
  • select_related括号内可以放多个外键字段,逗号隔开,会将这些外键字段关联的表与当前表全部拼成一张大表
  • 耗时:主要在联表时耗时(数据库层的操作)
  • 实例
res = models.Book.objects.select_related('publish')  # publish为外键字段
print(res)
for i in res:
  print(i.title)  # title为普通字段 , 只是对象点属性获取属性值,不走数据库
  print(i.publish)  # 只是对象点属性获取属性值,不走数据库

(2)prefetch_related()

  • prefetch_related原理是子查询
  • 自动帮你按步骤查询多张表,然后将查询的结果封装到对象中,用户的感觉好像还是联表操作
  • 括号内支持传多个外键字段,并且没有类型限制
  • 特点:每放一个外键字段,就会多走一条sql语句,多查询一张表
  • 耗时:查询的次数上的耗时
  • 实例
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()的优缺点

  • 没有谁比谁好,结合实际情况,使用不同方法。
  • 如两张表都太大时,联的表时会把不需要的一些数据行也连接在一起成一张大表,不但消耗更多的时间,也浪费内存,因为联表是数据库层的操作,所以还会增加数据库的负担。此时,用prefetch_related()方法更好。

二、MTV与MVC模型

  • 这两个东西都是纯理论,没有特别的意思。

1. MTV模型

  • MTV

    • M:models
    • T:templates
    • V:views
  • django自称为是MTV框架 本质其实还是MVC

2. MVC模型

  • MVC

    • M:models
    • V:views
    • C:controllar 路由匹配

三、chioces参数

  • chioces参数的作用是把一些数据信息映射成一个简单的字符串或者数字,在保存数据时只需要保存这些简单的字符串或数字即可,以此可以节省数据库资源。
  • 取值:
    • 只要是choices字段类型,在获取值的时候 统一句式: get_字段名_display() 。 若直接以对象点字段的方式,则获取到的是我们自定义chioces参数的值的每个元组中的第一个元素。
  • 插入数据:
    • 当我们在插入数据时,若插入chioces参数的自定义值中没有的数据,可以插入成功。在使用get_字段名_display()取值时,因为元组中没有第二个元素,不会报错,取值也只会取到第一个元素。这里不是很好理解,看下面的实例。
  • 实例
# 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

  • Ajax不是一个新的语言,他只是在原有的JS语言下,封装的一个大的方法。类似python中的装饰器。
  • AJAX 最大的作用是在不重新加载整个页面的情况下,可以与服务器交换数据并更新网页的部分内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)-
  • 题外话:
    • 每家公司都会有属于这家公司独有的内部管理软件
    • 专门用来开发企业内部管理软件框架 ——》 odoo
    • odoo框架内部功能实现全部依赖于python2

1. Ajax语法

(1)起手语法

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

(2)Ajax基本语法结构

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

$.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')
  • 注意:一旦你使用了ajax,django中必知必会三板斧(render/HttpResponse/redirect)都不再作用与页面,而是与recv_data交互,即这三个方法返回到前端的数据都被接收中recv_data中

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

  • 前端发到后端的数据都有数据编码格式,针对不同的数据,后端会自动进行不同的处理
  • 前端中,只要你的数据满足urlencoded格式,不管你当前的编码格式是什么,django后端都会自动解析,并且根据你的提交方式帮你封装到request.GET或request.POST
    • urlencoded编码格式对应的数据的格式:username=jason&password=123

1. 常见的编码格式

  1. urlencoded
  2. formdata
  3. application/json

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

  • form标签的控制编码格式的属性:enctype

(1)urlencoded编码格式

  • form表单默认编码格式是urlencoded
  • urlencoded编码格式对应的数据格式:
    • username=jason&password=123
  • django后端针对urlencoded数据,会自动解析,并且根据你的提交方式帮你封装到request.GET或request.POST

(2)formdata编码格式

  • 传文件时用的编码格式
  • 传文件必须做到两件事:
    • 必须将其默认的urlencoded换成formdata
    • 提交数据方式改为post
  • 针对formdata格式的数据,你在浏览器上是无法查看到,因为这时的提交方式肯定是post
  • 如果你是一个文件对象,django后端也会自动识别帮你放到request.FILES

(3)json格式

  • form表单无法发送json格式的数据 你要想法 你只能借助于ajax。

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

  • ajax能够发送3种格式的数据:

    • urlencoded
    • formdata
    • application/json

(1)urlencoded编码格式

  • ajax默认的编码格式也是urlencoded 也就意味着后端django也是会自动解析,并且根据你的提交方式帮你封装到request.GET或request.POST

(2)formdata编码格式

  • 文件对象的数据,django后端会自动识别并存放在request.FILES
  • Ajax传文件的实例:
  • 牢记实例中的1, 2, 3, 4 四点。
  • 以下MyFormData添加的前3条数据在后端会自动存放在request.POST中,最后一个文件数据会在后端自动存放在request.FILES中。
<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编码格式

  • django后端针对json格式的数据,不会做任何处理,数据怎么来的,只会原封不动的放到request.body中,需要你自己手动处理。(即到后端还是二进制类型的json格式的数据)
  • ajax传输json格式数据实例:
  • 注意:实例中的1, 2 两点
<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格式的数据的反序列化
# 因为ajax传输过来的json格式的数据是二进制类型的json格式,所以:

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

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

data = json.loads(ajax_data)

六、后端数据的序列化

  • 在实际开发环境中,针对前后端分离的模式,因为此时不能使用django的模板语法,后端返回到前端的数据需要非常多、非常清晰,并且是json格式的数据。如:要返回当前数据来自哪张表,数据要有描述即字典类型,还有等等,我们此时就需要自己手动书写,这样就会非常麻烦,也不保证没有缺漏的数据。
  • 针对上面的问题,通过django中的内置模块serializers就可以完美解决了。
  • 实例:
    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)

原文地址:https://www.cnblogs.com/Mcoming/p/11960875.html

时间: 2024-10-10 07:15:51

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

Django框架进阶5 models常用字段及参数, choices参数, 自动显示sql命令配置, orm查询优化相关, orm中的事务操作, MTV与MVC模型, 图书管理系统(图书的增删改查)

models中的常用字段 AutoField(primary_key=True) 主键   (int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列.) CharField(max_length=32)     varchar(32) IntegerField()       int BigIntergerField()           bigint DecimalField()    decimal EmailField(

choices字段、MTV与MVC模型、AJAX、contentType前后端传输数据编码格式、序列化组件、AJAX+sweetalert使用

目录 choices字段.MTV与MVC模型.AJAX.序列化组件.AJAX+sweetalert使用 choices字段 MTV与MVC模型 ajax 特点: ajax传json格式数据 ajax传文件 ajax传文件需要注意的事项 contentType前后端传输数据编码格式 ajax + sweetalert的使用 序列化组件 choices字段.MTV与MVC模型.AJAX.序列化组件.AJAX+sweetalert使用 choices字段 主要运用在用一些特殊字符或数字代表繁琐的字符串

Django-choices字段值对应关系(性别)-MTV与MVC科普-Ajax发json格式与文件格式数据-contentType格式-Ajax搭配sweetalert实现删除确认弹窗-自定义分页器-批量插入-07

目录 models 字段补充 choices 参数/字段(用的很多) MTV与MVC模型 科普 Ajax 发送 GET.POST 请求的几种常见方式 用 Ajax 做一个小案例 准备工作 动手用 Ajax 实现效果 contentType 前后端传输数据编码格式 ajax 提交数据 ajax发 json 格式数据 ajax 传文件 序列化组件 利用 sweetalert 搭建页面(弹窗) 弹窗中文支持不太好,手动修改样式 页面数据没刷新的问题 自定义分页器 批量插入测试数据 bulk_creat

MTV和MVC Ajax contentType 序列化组件 分页器

MTV与MVC模型        django框架 自称为是MTV框架            M:models            T:templates            V:views            MVC            M:models            V:views            C:controller 控制器(urls)        本质:MTV其实也是MVC Ajax    异步提交,局部刷新 请求方式      GET   POST a标签h

MVC模型与MTV模型

MVC模型: MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式,它把业务逻辑.模型数据.用户界面分离开来,让开发者将数据与表现解耦,前端工程师可以只改页面效果部分而不用接触后端代码,DBA可以重新命名数据表并且只需更改一个地方,无需从一大堆文件中进行查找和替换. MVC将web应用分为三层,分别是模型,视图,控制器.松耦合的连接方式,类似于插件的感觉.可以提高代码复用的能力. MVC特点是单向性: 1. 浏览器发送请求 2. 控制器和模型交互获取数据

models常用字段及参数,orm查询优化, choices参数及实际应用

一.自定义字段类型 from django.db import models # Create your models here. # 自定义CHAR类型 from django.db.models import Field class RealCharField(Field): # 这里是要继承Field类的 def __init__(self, max_length, *args, **kwargs): self.max_length = max_length # 拦截一个父类的方法 操作完

2019年6月14日 Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端传输数据编码格式contentType 批量插入数据和自定义分页器 一.MVC与MTV MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式,所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求. M

MTV与MVC

1.MVC MVC是一个架构模式,它分离了表现与交互.它被分为三个核心部件:模型.视图.控制器.下面是每一个部件的分工: 视图是用户看到并与之交互的界面. 模型表示业务数据,并提供数据给视图. 控制器接受用户的输入并调用模型和视图去完成用户的需求. 图: MVC (模型.视图.控制器) MVC的完整流程: 下面是MVC(模型.视图.控制器)架构的控制流程: 所有的终端用户请求被发送到控制器. 控制器依赖请求去选择加载哪个模型,并把模型附加到对应的视图. 附加了模型数据的最终视图做为响应发送给终端

MVC模型验证:属性值无require,页面仍然验证问题

为了更清晰的说明这个问题,我使用了VS2013自动生成的MVC示例来演示,运行示例项目,点击注册页面,如图: 接下来给上面的注册增加一个“年龄条件”,找到RegisterModel,添加一个”Age”属性,但是,不加”[require]”,如图: 运行项目,回到注册页面,用户名,密码,确认密码都填,年龄项不填,点击注册,如图: 我们发现它提示 “年龄字段是必须的”,但是我并没有在 Age属性上加require属性,它怎么还会验证呢? 起初我还以为页面缓存原因,清空缓存,问题仍然存在. 于是Goo