八 Django-基本查询操作

数据库基本操作(查询)

一、查询对象

从数据库里检索对象,可以通过模型的Manage来建立QuerySet,一个QuerySet表现为一个数据库中对象的结合,他可以有0个一个或多个过滤条件,在SQL里QuerySet相当于select语句用where或limit过滤。你通过模型的Manage来获取QuerySet,每个模型至少有一个Manage

注:Managers只可以通过模型的类访问,而不可以通过模型的实例访问,目的是为了强制区分“表级别”的操作和“记录级别”的操作

二、返回QuerySet对象

要检索数据库中的对象,就要为你的model 类构造一个查询集QuerySet。一个QuerySet就代表数据库中的一组数据。它可以有一个或很多个,也可以通过filter根据给定的参数对数据集做进一步筛选。在SQL术语中,QuerySet相当于SELECT语句,filter相当于WHERE或LIMIT这样的限定从句

为什么要使用QuerySet对象,主要是他包含两个比较重要的特性

  • 惰性机制
  • 缓存机制

query_set缓存机制1次数据库查询结果query_set都会对应一块缓存,再次使用该query_set时,不会发生新的SQL操作;这样减小了频繁操作数据库给数据库带来的压力

1、all

  1. 方法

    all()[]
    
  2. 说明

    查询所有信息 支持切片操作,切片只支持正整数,索引从0开始

  3. 示例代码

    #  不触发数据库操作
    users = UserInfo.objects.all()
    for user in users:
      # 触发数据库操作
      print(user.username)
    # 切片操作 触发数据库操作
    # 获取第11条数据
    users = UserInfo.objects.all()[10]
    # 获取前5条数据
    users = UserInfo.objects.all()[0:5]
    # 获取第1条到第10条数据
    users = UserInfo.objects.all()[1:10]
    
    users = UserInfo.objects.all()[0:10:2]
    

2、filter

  1. 方法

    filter(**kwargs)
    
  2. 说明

    返回一个QuerySet,包含满足查询参数的对象

  3. 参数

    • **kwargs

      查询的参数,where后面的条件

  4. 示例代码

    UserInfo.objects.filter(username='小明')
    

3、exclude()

  1. 方法

    exclude(**kwargs)
    
  2. 说明

    反向查询,指返回查询条件相反的对象

  3. 参数

    • **kwargs

      查询的参数,where后面的条件

  4. 示例代码

    UserInfo.objects.exclude(username='小明')
    

4、order_by()

  1. 方法

    order_by(**kwargs)
    
  2. 说明

    对结果集进行升序或降序,可指定需要排序的字段。

  3. 参数f

    • **kwargs

      查询的参数,order by后面的字段

  4. 示例代码

    # 升序
    UserInfo.objects.filter().order_by('create_date')
    # 降序
    UserInfo.objects.filter().order_by('-create_date')
    # 随机排序(开发中不要使用)
    UserInfo.objects.order_by('?create_date')
    

5、values()

  1. 方法

    values(**kwargs,**expressions)
    
  2. 说明

    • 当作为迭代器使用时,返回一个返回字典,而不是模型实例。
    • 该values()方法采用可选的位置参数,*fields它指定SELECT应限制的字段名称。如果指定了字段,每个字典将仅包含指定字段的字段键/值。如果不指定字段,则每个字典将包含数据库表中每个字段的键和值
    • 该values()方法还包含可选的关键字参数 **expressions
  3. 参数

    • **kwargs

      过滤的列

    • **expressions

      关键字参数 例如常见的:Lower(值转化成小写), Upper(值转化成大写), Length(计算值的长度)

  4. 示例代码

    UserInfo.objects.all().values()
    #指定字典
    UserInfo.objects.all().values('username')
    # 可选关键字 
    from django.db.models.functions import Lower, Upper, Length
    objects.values(lower=Lower('username'))
    objects.values(lower=Upper('username'))
    objects.values(lower=length('username'))
    

6、values_list()

  1. 方法

    values_list(*fields,flat=False)
    
  2. 说明

    返回列表,每个元组都包含传入values_list()调用的相应字段或表达式的值,

  3. 参数

    • *fields

      过滤在的字段

    • flat

      bool类型,默认是False,

      如果只传入单个字段,则还可以传入 flat 参数设置为True,这将意味着返回的结果是单值,而不是一元组。

  4. 示例代码

    # 查询所有字段的值
    users = UserInfo.objects.all().values_list()
    # 查询单值字段的值
    users = UserInfo.objects.values_list('username', flat=True)
    # 查询指定字段的值
    users = UserInfo.objects.values_list('uid', 'username')
    # 如果想查询单条记录可以
    users = UserInfo.objects.values_list('uid', 'username').first()
    # 或者
    users = UserInfo.objects.values_list('uid', 'username').get(pk=1)
    

7、raw()

  1. 方法

    raw(str)
    
  2. 说明

    在模型查询API不够用的情况下,你可以使用原始的SQL语句。Django提供两种方法使用原始SQL进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的SQL语句。

    raw()接受一个原始的SQL查询,执行它并返回一个 django.db.models.query.RawQuerySet实例。这个RawQuerySet实例可以像正常一样迭代QuerySet以提供对象实例。

  3. 参数说明

    • str

      原生sql语句

  4. 示例代码

    raw = UserInfo.objects.raw(
        'select * from UserInfo where username = '%s' ORDER BY id desc' % name)
    #通过raw方法查询的结果是一个RawQuerySet对象,如果想取到所有的值
    raw[0].__dict__ 
    #可以封装成方法
    def Serialization(objects) :
        '''
        _obj: objext -> list, Python 3.6新加入的特性, 用来标识这个方法接收一个对象并返回一个list
        orm.raw序列化
        '''
        _list = []
        _get = []
        for i in objects:
            _list.append(i.__dict__)
    
        for i in _list:
            del i['_state']
            _get.append(i)
        return _get
    

8、链式查询

  1. 说明

    类似jQuery的链式编程

  2. 示例代码

    users = UserInfo.objects.filter(username='test2').exclude(is_delete=True).filter(create_date=date(2018, 7, 5))
    # 等同
    # qt = UserInfo.objects.filter(username='test2')
    # qt = qt.exclude(is_delete=True)
    # qt = qt.filter(create_date=date(2018, 7, 5))
    

11、Q()

  1. 说明

    Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询。可以组合使用 &(and),|(or),~(not)操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象

    每个接受关键字参数的查询函数(例如filter()exclude()get())都可以传递一个或多个Q 对象作为位置(不带名的)参数。如果一个查询函数有多个Q 对象参数,这些参数的逻辑关系为“AND"

    注意:一定要把Q对象放在关键字参数查询的前面

  2. 示例代码

    # 查询 注册日期是2016-10-2 或者 2016-10-6日的所有用户信息
    users= UserInfo.objects.filter(
        Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
    )
    
    # 查询 用户名是xiaohong 和 没有注销的用户信息
    users= UserInfo.objects.filter(
        Q(username='xiaohong') & Q(is_delete=False)
    )
    

12、F()

  1. 说明

    允许Django在未实际链接数据的情况下具有对数据库字段的值的引用。通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交。F对象支持四则运算

  2. 示例代码

     # from django.db.models import F
     UserInfo.objects.update(num=F('num')+1)
    

三、不返回QuerySet对象

QuerySet方法结果集不返回QuerySet。这些方法不使用缓存。相反,他们每次查询都会调用数据库。

1、get()

  1. 方法

    get(**kwargs)
    
  2. 说明

    返回匹配给定查找参数的对象,该参数应采用字段查找中描述的格式

    如果没有找到给定参数的对象,则引发DoesNotExist异常。

    如果没有找多个给定参数的对象,则引发MultipleObjectsReturned异常。

  3. 参数说明

    **kwargs: 查询的参数

  4. 返回值

    模型对象

  5. 示例代码

    user = UserInfo.objects.get(uid=1)
    UserInfo.objects.get(id=1, username='xiaoming')
    

3、count()

  1. 方法

    count()
    
  2. 说明

    返回总条数

  3. 参数说明

  4. 返回值

    整形

  5. 示例代码

    UserInfo.objects.count()
    UserInfo.objects.filter(uid gt =1).count()
    

4、last()

  1. 说明

    获取最后最后一条数据

5、first()

  1. 说明

    获取第一条数据

6、annotate()

  1. 方法

    annotate(*args,**kwargs)
    
  2. 说明

    分组函数,用于实现聚合group by查询 前面的values写的是谁,就group谁

  3. 参数说明

  4. 返回值

    通过计算得到的聚合值的字典

  5. 示例代码

    from django.db.models import Avg, Min, Max, Count, Sum
    # 按性别统计用户的总数
    #  SELECT `sex`, COUNT('count') AS `uid` FROM `user` GROUP BY `sex`,
    users = UserInfo.objects.values('sex').annotate(uid=Count('uid'))
    # SELECT `user`.`sex`, COUNT(`user`.`uid`) AS `uid`, AVG(`user`.`age`) AS `ages` FROM `user` GROUP BY `user`.`sex`,
    users = UserInfo.objects.values('sex').annotate(uid=Count('uid'), ages=Avg('age'))
    

7、aggregate()

  1. 方法

    aggregate(*args, **kwargs)
    
  2. 说明

    聚合函数

  3. 参数说明

    • Avg,
    • Min,
    • Max,
    • Count,
    • Sum
  4. 返回值

    通过计算得到的聚合值的字典

  5. 示例代码

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

推荐阅读更多精彩内容