Django ORM概述

一、什么是Django ORM

ORM--(Object Relational Mapping)关系对象映射

QuerySet表示数据库中的对象集合。可以有0、1或多个过滤器,在SQL中,QuerySet等于SELECT语法过滤器是限制子句,如WHERE或LIMIT

那么怎么查看所执行的SQL语句呢,query.__str__(),或者print(QuerySet.query)

In [1]:Teacher.objects.all().query.__str__()
Out[1]: 'SELECT `teacher`.`id`, `teacher`.`name` FROM `teacher`'

二、基础操作(增删改查)

2.1、增

取对象,赋值然后,save()

>>> from school.models import *
>>> teacher = Teacher()
>>> teacher.name = "懒得卡"
>>> teacher.save()

2.2、删

delete(),批量删除就查询再删除

>>> Teacher.objects.get(pk=1).delete()

2.3、改

改得话有两种,取到具体某一个QuerySet对象,重新赋值然后save(),第二种就是查询后update(key="newvalue")

2.4、查

2.4.1、基础查询

  • 检索所有对象
    all()方法

      >>> Teacher.objects.all()
    
  • 检索特定对象
    filter() 返回QuerySet包含与给定查找条件匹配的新对象,是一个类似于列表的类型,所以只存在单个元素时候,也需要取索引.
    exclude() 返回QuerySet包含与查找条件不匹配的新对象

  • 检索单个对象
    get() 如果没有查询匹配的结果,get()则会引发DoseNotExist异常,有多个结果也会返回ObjectReturned异常

  • 字段查找

    精确匹配: __exact = "匹配内容",无实际作用

    忽略大小写匹配: __iexact = "匹配内容"

    包含匹配条件: __contains = "匹配内容", 同样的也有icontains

    模糊匹配: __startswith = "以内容开头",__endswith = "以内容结尾",同样有忽略大小写的,在前面加i就行

    正则匹配: __regex ="r'正则表达式匹配内容'",忽略大小写iregex

    比较匹配: 大于__gt,小于__lt,大于等于__gte,小于等于__lte

    __in = ["true","false","hahah"]__range(1,3)范围

    获取默认为空/不为空的字段: __isnull = True/False

  • 跨越关系的查找
    使用跨模型的相关字段,直接使用字段名称,用双下划线分割,可多次使用
    要使用"反向"关系,只需要使用模型的小写名称即可.

  • F查询(解决字段之间匹配的问题)

      >>> from django.db.models import F
      >>> # e.g. 要查找作者姓名和博客名称相同的所有条目
      >>> Entry.objects.filter(author__name=F('blog__name'))
    

    F对象支持+ , - , * , / , %(模运算,求余), ^(幂运算)和跨越关系等

      >>> e.g. 查找点赞数大于评论加收藏数的所有条目
      >>> Entry.objects.filter(goods__gt=F('comments')+F('collect'))
    

    对于日期和时间型的字段,可以用timedelta对象来实现加减

      >>> from datetime import timedelta
      >>> e.g. 查找发布时间超过3天的文章
      >>> Entry.objects.filter(date__gt=F('pub_date')+timedelta(day=3))
    
  • Q查询(解决"或"的问题)
    & , | , ~ 运算符,在两个Q对象上使用与或非运算符时,它会产生一个新的Q对象

      >>> from django.db.models import Q
      >>> Q(question__startswith="who") | Q(question__startswith="what")
    

2.4.2、聚合(Aggretations)

Django提供了两种生成聚合的方法

  • aggregate()聚合
    常见的聚合函数有Avg/Count/Sum/Max/Min等等

      >>> from django.db.models import Count
      >>> Entry.objects.all().aggregate(num_books=Count("book")).values("num_books")
      { 'num_books':27 }
      >>> # 这里的all()可以省略掉,就变成了
      >>> Entry.objects.aggregate(num_books=Count("book")).values("num_books")
      >>> # num_books为别名,类似于SQL里面的as
    

    aggregate()支持在聚合函数内内联Q查询

      >>> e.g. 统计整个班男生和女生的数量(gender为0为男生,1为女生)
      >>> Student.objects.aggregate(mail=Count("gender",filter=Q(gender=0)),famail=Count("gender",filter=Q(gender=1)))
    
  • annotate()分组
    分组和MySQL中的分组不太一样,它默认对所用对象的id进行分组,比如Student.objects.annotate(...)就是将学生按学生id进行分组了已经.同样的,分组一定要进行聚合操作</br>
    所以在反复练习之后,对用那个对象进行查询就很明显了,例如查询AAA大于/小于/其他条件的BBB的CCC项那就是使用BBB的对象了,BBB.objects.(...)

  • order_by()排序
    排序也没要多的需要讲的,order_by("-name")降序,默认排序方式为由低到高

  • values()/values_list() 获取查询结果的某一或者某些列,values_list获取的值为一个元组

  • distinct() 从返回结果中剔除重复记录.这个不属于聚合,但是在学习这些的时候遇到了

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

推荐阅读更多精彩内容

  • 原文:https://my.oschina.net/liuyuantao/blog/751438 查询集API 参...
    阳光小镇少爷阅读 3,802评论 0 8
  • Django 1.8.2 文档Home | Table of contents | Index | Modules...
    轩辕小爱阅读 2,343评论 0 2
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,054评论 0 8
  • 数据库基本操作(查询) 一、查询对象 从数据库里检索对象,可以通过模型的Manage来建立QuerySet,一个Q...
    唯老阅读 782评论 0 6
  • (故友闲聚)它方有店喜迎客,故人开铺宴朋友。廿年江湖各风骚,各有天地一方主。桌面说尽风霜史,杯中装满岁月舟。围台道...
    甘朝武阅读 171评论 0 0