08-模型-条件查询

  1. 字段查询

    1. 实现sql中where的功能,调用过滤器filter()、exclude()、get(),下面以filter()为例
    2. 通过“属性名_id”表示外键对应对象的id值
    3. 语法如下
    4. 说明:属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线
      1. 属性名称__比较运算符=值
  2. 条件运算符

    1. exact:表示判等

      1. 例:查询编号为1的图书
        list=BookInfo.books.filter(id__exact=1)
        可简写为:
        list=BookInfo.books.filter(id=1)
        
    2. contains:是否包含

    3. 说明:如果要包含%无需转义,直接写即可

    4. 例:查询书名包含‘传’的图书

      1. list = BookInfo.books.filter(btitle__contains='传')
    5. startswith、endswith:以指定值开头或结尾

    6. 例:查询书名以‘部’结尾的图书

      1. list = BookInfo.books.filter(btitle__endswith='部')
    7. isnull:是否为null

      1. 例:查询书名不为空的图书
        list = BookInfo.books.filter(btitle__isnull=False)
    8. 以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith

    9. in:是否包含在范围内

      1. 例:查询编号为1或3或5的图书
        list = BookInfo.books.filter(pk__in=[1, 3, 5])
    10. gt、gte、lt、lte:大于、大于等于、小于、小于等于

      1. 例:查询编号大于3的图书
        list = BookInfo.books.filter(id__gt=3)
    11. 不等于使用等于的运算符,使用exclude()过滤器
      例:查询编号不等于3的图书
      list = BookInfo.books.exclude(id=3)

    12. 不等查询
      year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
      例:查询1980年发表的图书
      list = BookInfo.books.filter(bpub_date__year=1980)

    13. 日期查询1

      例:查询1980年1月1日后发表的图书
      list = BookInfo.books.filter(bpub_date__gt=date(1990, 1, 1))

      日期查询2

  3. 关联查询(外连接类似)

    1. Django中也能实现类似于join查询
      语法如下

      1. 关联模型类名小写属性名运算符=值

      2. 如果没有没有“__运算符”部分,表示等于,结果和sql中的inner join相同

        1. 例:查询图书,要求图书中英雄的描述包含‘八’
            list = BookInfo.books.filter(heroinfo__hcontent__contains='八')
        
        1. 例:查询书名为"天龙八部"的所有英雄
            list = HeroInfo.objects.filter(hbook__btitle='天龙八部')
        
    2. F对象

      之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中
      语法如下

      1. F(属性名)
        例:查询阅读量大于等于评论量的图书
      from django.db.models import F
      ...
      list = BookInfo.books.filter(bread__gte=F('bcommet'))
      
      1. 可以在F()对象上使用算数运算
        例:查询阅读量大于2倍评论量的图书
      list = BookInfo.books.filter(bread__gt=F('bcommet') * 2)
      
    3. Q对象

      1. 多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字
      2. 例:查询阅读量大于20,并且编号小于3的图书
        list=BookInfo.books.filter(bread__gt=20,id__lt=3)

        list=BookInfo.books.filter(bread__gt=20).filter(id__lt=3)
    3. 如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符
    4. **Q对象被义在django.db.models中**
        1. 语法如下
            Q(属性名__运算符=值)
            1. 例:查询阅读量大于20的图书,改写为Q对象如下
            from django.db.models import Q
            ...
            list = BookInfo.books.filter(Q(bread__gt=20))
            

        2. Q对象可以使用&、|连接,**&表示逻辑与,|表示逻辑或**
            1. 例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
            list = BookInfo.books.filter(Q(bread__gt=20) | Q(pk__lt=3))
        

    5. Q对象前可以使用~操作符,表示非not
        1. 例:查询编号不等于3的图书
        list = BookInfo.books.filter(~Q(pk=3))
  1. 聚合函数
    1. 使用aggregate()过滤器调用聚合函数
      聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中

      1. 例:查询图书的总阅读量
      from django.db.models import Sum
      ...
      list = BookInfo.books.aggregate(Sum('bread'))
      
    2. 在运行服务器命令行可以看到list的字典结果

    3. 使用count时一般不使用aggregate()过滤器

      1. 例:查询图书总数
        list = BookInfo.books.count()
    4. 在运行服务器命令行可以看到list的结果

  1. 关联查询的练习

    1. 关联的查询
      在定义模型类时,可以指定三种关联关系,最常用的是一对多关系,如本例中的“图书-英雄”就为一对多关系,接下来进入shell练习关系的查询

      python manage.py shell

      1. 查询编号为1的图书
        book=BookInfo.books.get(pk=1)

      2. 获得book图书的所有英雄
        book.heroinfo_set.all()

      3. 获得编号为1的英雄
        hero=HeroInfo.objects.get(pk=1)

      4. 获得hero英雄出自的图书
        hero.hbook

    2. 自关联

      1. 对于地区信息、分类信息等数据,表结构非常类似,每个表的数据量十分有限,为了充分利用数据表的大量数据存储功能,可以可以设计成一张表,内部的关系字段指向本表的主键,这就是自关联的表结构

      2. 打开booktest/models.py文件,定义AreaInfo类
        说明:关系属性使用self指向本类,要求null和blank允许为空,因为一级数据是没有父级的

      定义地区模型类,存储省、市、区县信息

      class AreaInfo(models.Model):
          atitle=models.CharField(max_length=30)#名称
          aParent=models.ForeignKey('self',null=True,blank=True)#关系
      
      1. 迁移

        1. python manage.py makemigrations
          python manage.py migrate
      2. 打开mysql命令行,导入数据

        1. source areas.sql
      3. 打开booktest/views.py文件,定义视图area

        from models import AreaInfo
        ...
        #查询广州市的信息
        def area(request):
            area = AreaInfo.objects.get(pk=440100)
            return render(request, 'booktest/area.html', {'area': area})
        
        
      4. 打开booktest/urls.py文件,新建一条url

        urlpatterns = [
            ...
            url(r'^area/$', views.area),
        ]
        
      5. 在templates/booktest目录下,新建area.html文件

        <html>
        <head>
            <title>地区</title>
        </head>
        <body>
        当前地区:{{area.atitle}}
        <hr/>
        上级地区:{{area.aParent.atitle}}
        <hr/>
        下级地区:
        <ul>
            {%for a in area.areainfo_set.all%}
            <li>{{a.atitle}}</li>
            {%endfor%}
        </ul>
        </body>
        </html>
        
        1. 运行服务器
          python manage.py runserver
  2. 总结

    1. 修改配置文件使用mysql数据库
    2. 属性类型及选项
    3. 自定义管理器及用途
    4. 查询集和条件查询
    5. 关联
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 元选项  在模型类中定义类 Meta,用于设置元信息 元信息db_table:定义数据表名称,推荐使用小写字母...
    流蓝浅阅读 446评论 0 0
  • 前言 根据前几篇文章的分享已经了解djangoWeb开发一般步骤为:创建虚拟环境安装django创建项目创建应用在...
    博行天下阅读 1,109评论 0 2
  • 简介 查询集表示从数据库中获取的对象集合。查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果...
    a上癮阅读 1,223评论 0 0
  • 1,定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认h...
    晓可加油阅读 545评论 0 2
  • 今天出去要资源,外面特别冷,自己也受到影响。所以导致今天状况特别差劲。遇到人们拒绝之后,也没有倾尽全力要微信。一切...
    小小小小疯癫阅读 105评论 2 0