2018-11-28 ORM操作数据库

一、ORM查询数据库

1.1 filter()过滤器 -- 精确查询

 作用: 返回符合条件的数据

对象.objects.filter(筛选条件): 查询满足条件的查询集

1.2 获取所有数据

对象.objects.all() : 返回数据库中所有数据集

1.3 获取满足条件的数据

对象.objects.get(筛选条件):

 注意:获取满足条件的对象,但是查询条件必须存在,并且查询数据条数为1条,否则都会报错
而filter()当查询条件不存在时返回空查询集,数据条数大于1时,返回一个列表类型的查询集

对象.objects.exclude(过滤条件)
返回不满足条件的结果集(QuerySet),也可以说是过滤掉满足条件的结果集

1.4 组合条件查询

  如:

    # 查询年龄等于18且性别为女的学生信息
    stus = Student.objects.filter(age=18).filter(gender=0)
    # 多个条件可以写在一个filter中(推荐使用)
    stus = Student.objects.filter(age=18, gender=0)

二、 从查询集中获取数据

 2.1 下标获取

stus = Student.objects.all()
如: stus[0]
但是注意下标越界异常

 2.2 first() 获取第一个元素

如: stus.first()

 2.3 last() 获取最后一个元素

如: stus.last()

三、 排序 order_by

对象.objects.order_by(排序字段)

  如:

   stus = Student.objects.all().order_by('-id')
   # 排序 order_by
   # 降序 -id 在sql中 id desc
   # 升序 id  在sql中 id asc

  测试可以通过values()获取对象键值对

如:stus.values()

限制查询集,可以使用下标的方法进行限制,等同于sql中的limit

模型名.objects.all()[0:5] 小标不能为负数
函数 说明
first() 返回查询集中的第一个对象
last() 返回查询集中的最后一个对象
count() 返回当前查询集中的对象个数
exists() 判断查询集中是否有数据,如果有数据返回True,没有返回False

四、 模糊查询

  4.1 contains 包含 类似于 like %小%

如:
stus = Student.objects.filter(name__contains='小')

  4.2 endswith 以什么结束 类似于 like %小

如:
stus = Student.objects.filter(name_endswith='明')

  4.3 startswith 以什么开头 类似于 like 大%

如:
stus = Student.objects.filter(name__startswith='大')

  注意:以上模糊查询中都对大小写敏感,可以在前面加 i(ignore)忽略大小写(icontains、istartwith、iendswith)

  4.4 集合运算 -- in

如:
stus = Student.objects.filter(id__in=[2, 3, 5, 14])
stus = Student.objects.filter(pk__in=[2, 3, 5, 14])

  4.5 比较运算

gt(大于)、gte(大于等于)、lt(小于)、lte(小于等于)

如:
stus = Student.objects.filter(age__gt=18)

  4.5 聚合 aggreagate()

sql中有的聚合函数这里都有(Sum Avg Max Min Count)
  • 需要导入相应的包

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

  如:

avg_age = Student.objects.all().aggregate(Avg('age'))
sum_age = Student.objects.all().aggregate(Sum('age'))

  4.6 逻辑运算(且(&)、 或(|)、 非(~))

逻辑运算需要借助F对象和Q对象,所以需要先导入相应的包
from django.db.models import F, Q

  如:

    # 查询age=18或者gender=0的学生信息
    # Q(条件)
    stus = Student.objects.filter(Q(age=18), Q(gender=0))      # 相当于与(&)
    stus = Student.objects.filter(Q(age=18) &  Q(gender=0))
    stus = Student.objects.filter(Q(age=18) | Q(gender=0))
    stus = Student.objects.filter(~Q(age=18) & Q(gender=1))

    # F() 对象
    # 查询语文成绩比数学成绩大的学生信息
    stus = Student.objects.filter(yuwen__gt=F('shuxue'))

    # 查询语文成绩比数学成绩大10分的学生信息
    stus = Student.objects.filter(yuwen__gt=F('shuxue') + 10)
    # F对象支持数学运算

<center>小结</center>

条件 说明
exact / iexact 精确匹配/忽略大小写的精确匹配查询
contains / icontains / startswith / istartswith / endswith / iendswith 基于like的模糊查询
in 集合运算
gt / gte / lt / lte 大于/大于等于/小于/小于等于关系运算
range 指定范围查询(SQL中的between…and…)
year / month / day / week_day / hour / minute / second 查询时间日期
isnull 查询空值(True)或非空值(False)
search 基于全文索引的全文检索
regex / iregex 基于正则表达式的模糊匹配查询

六、一对一(OneToOneField)的关联查询

  6.1 概述: 在python中一对一的关系主要通过OneToOneField来实现,与sql中的外键关联差不多,但是在一对一的关系中外键可以添加在需要关联的任意一个模型中(一对多关系中外键一般加在多的一边)

 例如:

# 学生类
class Student(models.Model):
    name = models.CharField(max_length=20)
    age  = models.IntegerField(default=18)

    class Meta:
        # 设置表明
        db_table = 'tb_student'

# 学生信息扩展类
class StuInfo(models.Model):
    phone = models.CharField(max_length=11)
    address = models.CharField(max_length=31)
    # 添加外键
    stu = models.OneToOneField(Student)

    class Meta:
        db_table = 'tb_stuinfo'

  注意:OneToOneField等价ForeignKey,且约束unique=True,并且外键映射到数据库中时会键外键字段名默认为 ---- 字段_id
如上面定义的stu外键在数据库中为: stu_id

  6.2 正向关联查询

子表查询主表为 --- 正向查询
主表查询子表为 --- 反向查询

  如:

    # 正向查询
    # 查询电话为10011的学生姓名(子表查主表)
    stu_info = StuInfo.objects.filter(phone='10011').first()
    stu = stu_info.stu
    name = stu.name

  6.2 反向关联查询

  如:

    # 反向查询
    # 查询名字为小明的学生电话name='小明'
    stu = Student.objects.filter(name='小明').first()
    stu_info = stu.stuinfo
    phone = stu_info.phone

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

推荐阅读更多精彩内容