zoukankan      html  css  js  c++  java
  • day 68 django 之api操作 | jQueryset集合与对象

    我们的orm里面分为:

    jQueryset集合,

    还有对象,

    我们的jqueryset集合里面可以有多个对象,这句话的意思就是我们的对象是最小的单位,不可以再拆分了,我们的jQueryset集合就相当于是一个容器我们的一个个对象就放到这个容器里面,不论容器里面是否只有一个对象,还是没有对象,容器就是容器,本质是不会变的,就像我们的碗,即便是空碗里面什么都没有,它本质也是一个碗一样.

    这里要强调它的本质,是因为我们的jQueryset集合和对象是分属于不同的领域,他们对应的方法也是不一样的,我们的jQueryset集合根本上的主流应用场景就是对我们的数据库的表格操作,对象也是一样的,

    那么我们首先是需要先得到jQueryset集合或者是对象然后才能拿着它去数据库里面进行操作,下面的api常用方法就是帮我们拿到jQueryset集合或者是对象的方法,使用它们会有返回值,我们根据得到的返回值就可以知道是对象还是jQueryset集合,然后我们调用对应的方法

    我们的对数据库的操作就是增删改查,

    在jQueryset集合里面,我们的这个容器就类似于一个集合,我们的集合数据类型是可以在里面添加,修改,删除,查询对象的.

    在对象里面,我们可以得到一个对象,然后对这个对象它本身就是最小的单位了,就像我们上面提到的,它是不可再拆分的,那么我们得到了它之后就无需再对它进行查询了,它本身就是我们查询的结果,然后同理,它本身就是结果了,我们也无需再对它进行增加了,它本身就是最小的单位了,无从增加,但是可以进行修改和删除,我们可以得到了这个对象然后把它删除,或者修改它,使用字典里面直接等于的方法,例如:对象.字段名(需要修改的字段值)=[新赋值的变量值]然后对象名.save()保存修改即可,我们的字典是直接使用到了key=新赋予的变量值,然后就完成了修改,但是在orm里面我们需要多一步操作保存修改save(),

    teacher_obj=models.Teacher.objects.get(id=arg)

    teacher_obj.tname=tname

    teacher_obj.save()

    所以我们的对象就只有删除和更改两个应用场景的操作,删除使用delete(),修改用赋值的方式加上save()

    而jQueryset集合里面有增删改查,{创建数据使用create(),} add(),delete(),update(),-----[exclude,all,filter]这里的中括号里面的都是查询

    queryset与惰性机制

     我们的queryset内部是一个可迭代对象,它的特点就是惰性运算,我们的数据在里面生成之后就只是保存到里面而已,如果不调用他们,就会一直在里面存着不会显露出来,直到我们调用它才会有数据倒出来,queryset特点: 可迭代,可切片

    objs=models.Book.objects.all()  # 假设objs里面有很多个值[obj1,obj2,obj3,,,,,]

    for i in objs:

      print('obj:' i)

    print(objs[1])

    print(objs[1:4])

    print(objs[::-1])  # 这里如果忘记了就提醒一下,我们的切片是从0到0,然后倒序切,从后往前开始切隔一个取一个值,

    queryset的高效使用:

    <1>django的queryset是惰性的
    django的queryset对应于数据库的若干记录row,通过可选的查询来过滤,例如,下面的代码会得到数据库中国名字为'Dave'的所有人:Person_set=Person.objects.filter(first_name='Dave')
    上面的代码并没有运行任何的数据库查询,你可以使用person_set,给它加上一些过滤条件,或者将它传给某个函数,这些操作都不会发送给数据库,这是对的,因为数据库的查询是显著影响文本应用性能的因素之一,
    
    <2>要真正从数据库获得数据,你可以遍历queryset或者使用if queryset,总之你用到数据时就会执行sql,为了验证这些,需要在setting里加入logging(验证方式)
    obj=models.Book.objects.filter(id=3)
    #for i in obj:
        # print(i)
    # if obj:
        # print('ok')
    
    <3>queryset是具有cache的当你遍历queryset时,所有匹配的记录会从数据库获取,然后转换成django的model.这被称为执行(evaluation).这些model会保存在queryset内置的cache中,这样如果你再次遍历这个queryset,你不需要重复运行通用的查询,
    
    obj=models.Book.objects.filter(id=3)
    # for i in obj:
    #    print(i)     
    
    models.Book.objects.filter(id=2).update(title='go')
    obj_new=models.Book.objects.filter(id=4)
    # for i in obj:
        # print(i)  # logging只会打印一次
    
    
    <4>简单的使用if语句进行判断也会完全执行整个queryset并把数据放入cache,虽然你并不需要这些数据!,为了避免这个,可以用exists()方法来检查是否有数据:
    
    obj=Book.objects.filter(id=2)
    exists() 的检查可以避免数据放入queryset的cache,
    if obj.exists():
        print('hello world!')
    
    <5>当queryset非常巨大时,cache会成为问题处理成千上万的记录时,将它们一次装入内存是很浪费的,更糟糕的是,巨大的queryset可能会锁住系统进程,让你的程序濒临崩溃,要避免在遍历数据的同时产生queryset cache, 可以使用iterator()方法来获取数据,处理完数据就将其丢弃,
    objs=Book.objects.all().iterator()
    iterator()可以一次只从数据库获取少量数据,这样可以节省内存
    for i in objs:
        print(obj.name)
    # but,在此遍历没有打印,因为迭代器已经在一次遍历(next)到最后一次了,没得遍历了,
    for i in objs:
        print(i.name)
    
    # 当然,使用iterator()方法来防止生成cache,意为这遍历同一queryset时会重复执行查询,所以使用iterator()的时候要当心,确保你的代码在操作一个大的queryset时没哟重复执行查询
    
    总结:queryset的cache是用于减少程序对数据库的查询,在通常的使用下会保证只有在需要的时候才会查询数据库,使用exists()和iterator()方法可以以优化程序对内存的使用,不过,由于它们并不会生成queryset cache,可能会造成额外的数据库查询

    前情回顾一下,:

    django项目

    安装:

    创建项目

    配置(setting,static,csrf)

    创建app,python manage.py startapp app1

    三部分

    urls.py路由配置

    1,普通正则

    2分组正则

    传位置参数:url(r'^blog/(d+)/',views.blog)

    3分组命名(得到的是关键字参数)

    url(r'^blog/(?P<year>(d+)/',views.blog'))    视图函数要传参blog(request,year)

    4用name指定别名

    url(r'^blog/$', views.blog, name='blog') 这里我们使用别名来进行反向解析,为了得到动态的HTML页面跳转效果

    html里面:{%url 'blog'%}

    views函数里面from django.urls import reverse

    函数返回值里面return reverse("blog")

    5使用命名空间

    url(r'^blog/', include(app1.urls,namespace='num1' 2017 12))  这里也牵涉到反向解析

    HTML里面{% url 'num1:blog'%}  url后面空一格写单引号,引号里面写namespace然后冒号name

    views里面:from django.urls import reverse 返回值return redirect(reverse("num1:blog",arg=(2017,12)))

    views.py

    request对象

    response对象

    FBV和CBV

    模板语言

    {{变量}}

    {{变量.}}如果变量是一个字典,我们直接使用这样的方法去取值

    {%for%}循环

    {%endfor%}结束循环

    {%if%}判断

    {%endif%}结束判断

    过滤器(filter)  {{变量名|filter_name:参数}}

    {{时间对象|date:'Y-m-d'}}

    {%url%}

    {%load static%}

    {%static 'img/1.png'%}

    母板,继承,块,组件

    连接数据库(orm)

    五步四部分

    1创建数据库

    2在app下的models.py里面创建model类,继承models.Model

    3.在setting.py里面配置数据库连接信息

    4在项目project的init里面写上import pymysql, pymysql.install_as_mysqldb()  # 这一句使用我们的pycharm会自动补全,有提示信息

    5,发命令

    python manage.py makemigrations  # 收集变更

    python manage.py migrate  # 翻译成sql语句执行

    四部分

    models.py

    django

    pymysql

    mysql

    orm:类   数据表

    类的属性  

    数据列 (表里面的字段)  

    对象   数据行

    对表格进行增删改查:

    查:

    models.类名,objects.all()  取到所有的数据是一个列表  [取不到值是不会报错的,就显示为空]

    models.类名,objects.get()  取到一个对象[特点是取不到值就会报错]

    models.类名.objects.exclude(条件)  得到除了这个条件的其他的结果

    models.类名.objects.first()

    models.类名.objects.last()

    增加:

    一种方式:

    models.类名.objects.create(name='peter')

    一种方式:

    obj = models.类名(name='peter')

    obj.save()

    删除:

    models.类名,objects.filter(age=19).delete()

    修改:

    models.类名.objects.filter(age=90).update(name='greate')

    单个对象是不能够调用update的[只有jQueryset才可以调用update方法]

    update()方法对于任何结果集queryset均有效,这意味着我们可以同时更新多条记录update返回的是一个整型数据类型,表示受影响的条数

    我们的对象要想使用修改操作只能够使用下面的方式直接赋值

    obj=models.类名.objects.get(id=1)

    obj.name='green'

    obj.save()

    今日内容:

    单标的增删改查

    单表查询的api介绍:

    13条常用数据:

    返回的是queryset对象

    0.update()  

    1.all()

    2.filter()

    3.exclude()

    4.values()

    5.values_list()

    6.order_by()

    7.reverse()

    8.distinct()

    9.create()

    10.delete()

    11.order_by()

    12.values()

    13.values_list()

    返回数字的:

    count()

    返回bool值的:

    exists()

    返回具体的数据对象的:

    get()

    first()

    last()

    delete()

    下划线用法:

    models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
     
    models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
    models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in
     
    models.Tb1.objects.filter(name__contains="ven")  # 获取name字段包含"ven"的
    models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
     
    models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and
     
    类似的还有:startswith,istartswith, endswith, iendswith 
    
    date字段还可以:
    models.Class.objects.filter(first_day__year=2017)

    在我们的pycharm里面python console里面先引入我们的models, from app名称 import models

    然后就输入上面的命令即可

    logging配置参数:

    logging={

    'version':1,  # 目前为止只有这一个值,当前使用版本

    'disable_existing_loggers':false,  # 不禁用已经存在的logger实例

    # 定义一些日志的处理方式

    'handlers':{

    'console':{

    'level':''DEBUG'',

    'class':'logging.streamhandler',

    },

    },

    'loggers':{

    'django.db.backends':{

    'handlers':['console'],

    'propagate':True,  # 向上传导

    'level':''DEBUG'',

    },

    }

    }

  • 相关阅读:
    【leetcode】Spiral Matrix
    【leetcode】Permutations
    【leetcode】Search Insert Position
    【leetcode】Search for a Range
    文件名对目标文件夹可能过长
    协同过滤和简单SVD优化
    奇异值分解(SVD)和简单图像压缩
    PCA数据降维
    FP-growth高效频繁项集发现
    关联挖掘和Aprioir算法
  • 原文地址:https://www.cnblogs.com/2012-dream/p/8330924.html
Copyright © 2011-2022 走看看