zoukankan      html  css  js  c++  java
  • Django中模型(五)

    Django中模型(五)

    六、模型查询

    1、概述

    查询集,表示从数据库获取的对象集合。

    过滤器就是一个函数,基于所给的参数限制查询集结果。查询集可以有多个过滤器。

    从sql角度来说,查询集合等价于select语句,过滤器等价于where条件。

    2、查询集

    A、概述

    在管理器上调用过滤器方法返回查询集。查询集经过过滤器方法筛选后返回新的查询集,所以可以写成链式调用。

    B、惰式执行

    创建查询集不会带来任何数据的访问,直到调用数据时,才会访问数据库

    C、直接访问数据库的情况

    迭代、序列化、与if合用

    D、过滤器

    过滤器,返回查询集的方法称为过滤器。

    all():返回所有数据

    filter():

             返回符合条件的数据。

             filter(‘键’=‘值’):键是数据表中的字段名,值是条件。返回满足条件的数据

             filter(‘键’=‘值’,‘键’=‘值’):返回同时满足两个条件的数据

             filter(‘键’=‘值’). filter(‘键’=‘值’):同上

    exclude():过滤掉符合条件的数据

    order_by(‘字段名’):以某字段排序

    values():一条数据就是一个对象(字典类),返回一个列表

    E、返回单个数据

    get():返回一个满足条件的对象。注意:如果没有找到符合条件的对象,会引发“模型类.DoesNotExist”异常;如果找到多个对象,会引发“模型类.MultipleObjectsReturned”异常。

    count():返回当前查询集中的对象个数。

    first():返回查询集中的第一个对象

    last():返回查询集中的最后一个对象

    exists():判断查询集中是否有数据,如果有数据则返回True

    F、限制查询集

    查询集返回列表,可以使用下标的方法进行限制,等同于sql中的limit语句。

    eg:

    studentsList=students.objects.all()[0:5]

    注意:下标不能为负数

    G、查询集的缓存

    每个查询集都包含一个缓存,来最小化的对数据库访问;在新建的查询集中,缓存首次为空,第一次对数据集查询求值,会发生数据缓存,Django会将查询出来的数据做一个缓存,并返回查询结构,以后的查询直接使用查询集的缓存。

    F、字段查询

    概述:

    实现了sql中的where语句,作为方法filter()、exclude()、get()的参数。

    语法:

    属性名称__比较运算符=值

    外键:

    属性名_id

    转义:

    比较运算符:

    exact:判断,区分大小写

    contains:是否包含,区分大小写

    eg:views.py

    def studentsearch(request):
    
    studentList=Students.objects.filter(sname_contains='')#查询Student数据表中sname字段值中包含‘孙’的值
    
        return rander(request,'news.html',{"students":studentList})

    startswith(value),endswith(value):以value开头或结尾,区分大小写

    eg:views.py

    def studentsearch(request):
    
        studentList=Students.objects.filter(sname_startswith='') #查询Student数据表中sname字段值中以‘孙’开头的值
    
        return rander(request,'news.html',{"students":studentList})

    注意:以上四个在前面加上i,表示不区分大小写。iexact,icontains,istartswith,iendswith。

    isnull、isnotnull:

    判断是否为空。和以上几个使用方法一致:属性名__isnull=False)

    in:

    是否在内。

    gt:大于

    gte:大于等于

    lt:小于

    lte:小于等于

    year:年

    month:月

    day:天

    week_day

    minute:分

    second:秒

    G、查询快捷

    PK:代表主键

    H、聚合函数

    聚合函数需写在aggregate()的括号里。还需要引入相应的模块:

    from django.db.models import Avg Count, Min, Max, Sum

    Avg():取平均值

    Count():返回数据的个数

    Max():返回该字段的最大值

    Min():返回该字段的最小值

    Sun():返回该字段的和

    eg:abs = table_name.objects.filter(date=n_lastday, brand=depart).aggregate(Max('rank'))

       打印结果为  {'rank__max': 42}

    I:跨关联查询

    处理join查询。语法:模型类名__属性名__比较运算符。

    eg:返回描述中带有“孙红雷”这三个字的的数据属于哪个班级

    grade=Grades.objects.filter(students__scontend__contains='孙红雷')

    Grades:年级数据表,该表中有班级字段

    students:学生数据表,该表中有描述字段“scontend”

    contains:比较运算符,包含

    J、F对象

    使用模型A的属性与模型B属性进行比较,实际上是一条数据的两个值进行比较。

    F对象支持算数符运算。

    eg:views.py     取出女生人数比男生人数多的数据

    from django.db.models import F
    
    def grades(request):  
    
    #取出女生人数比男生人数多的数据g=Grades.objects.filter(ggirlnum__gt=F('gboynum'))
    
    #取出女生人数大于男生人数加20后的数据
    
    gb=Grades.objects.filter(ggirlnum__gt=F('gboynum'+20))
    
        print(g)
    
        print(g)

    Grades:年级数据表

    ggirlnum:字段,女生人数

    gt:比较运算符,大于

    gboynum:字段,男生人数

    K、Q对象

    进行或查询。

    eg:views.py

    from django.db.models import Q
    def grades(request):
        #取出主键值小于3或sage大于18的所有值
    
    s=Students.objects.filter(Q(PK__lte=3)|Q(sage__gt=18))#
        print(s)

     七、外键的添加

    models.py

    class A(models.Model):
        title = models.CharField(max_length=20)
    
    
    class B(models.Model):
        bname = models.CharField(max_length=20)
        fk = models.ForeignKey(A, on_delete=models.DO_NOTHING)

    views.py

    from .models import *
    
    # 方法一
    B.objects.creat(bname='test', fk=A.object.get(id=1))
    # 方法二
    B.objects.creat(bname='test', fk_id=1)
  • 相关阅读:
    【2017-06-20】Linux应用开发工程师C/C++面试问题记录之一:Linux多线程程序的同步问题
    April 14 2017 Week 15 Friday
    April 13 2017 Week 15 Thursday
    April 12 2017 Week 15 Wednesday
    【2017-06-17】QtGui基础控件:QSpinBox及QDoubleSpinBox
    April 11 2017 Week 15 Tuesday
    April 10 2017 Week 15 Monday
    April 9 2017 Week 15 Sunday
    April 8 2017 Week 14 Saturday
    April 7 2017 Week 14 Friday
  • 原文地址:https://www.cnblogs.com/xshan/p/8327584.html
Copyright © 2011-2022 走看看