7.models之查询

django.db.models.query.QuerySet
QuerySet的特点:

  1. 是可迭代的
  2. 可切片

查询相关的API

  • get(**kwargs):返回与所给的筛选条件相匹配的对象,返回的结果有且只有一个,如果符合条件的对象超过一个会抛出app名.models.MultipleObjectsReturned异常,如果没有找到符合条件的查询会抛出 app名.models.DoesNotExist异常---model对象
  • all():会查询所有结果---QuerySet对象
  • filter(**kwargs):它包含那些与所给筛选条件匹配的对象---QuerySet对象
  • exclude(**kwargs):它包含那些与所给筛选条件不匹配的对象---QuerySet对象
  • order_by(*fields):对查询的结果排序(在查询的字段前加-号可按结果的反向排序)
  • reverse():对查询的结果再进行反排序
  • disinct():对查询的结果去重
  • values(*fields):返回一个VaulesQuerySet--一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
  • values_list(*fields):它与vaules()结果相似,不过后者返回的是字典序列,而vaules_list返回的结果是元祖序列
  • count():返回数据库中匹配查询(QuerySet)的对象数量
  • first():返回第一条数据等价于[0]
  • last():返回最后一条数据等价于[-1]
  • exists():是否存在数据(True|False)
  • 更多api在model层的 查询结果集(QuerySet)中的QuerySet method reference(查询结果集api参考)里面

多表联合查询

一:查询id为1的作者的所有信息

#一般用这种方式获取信息,但是不利于获取信息
AuthorDetail.objects.filter(id=1)
# 这种方式可以很好的打印出所有信息,但是作者返回的是id不友好,应该返回姓名比较好
AuthorDetail.objects.filter(id=1).values("id", "sex", "email", "address", "birthday", "author")
# 有主外的可以通过两个下划线接要查询的字段来查询
AuthorDetail.objects.filter(id=1).values("id", "sex", "email", "address", "birthday", "author__name")

二:查询《python实战》这本书的作者姓名和出版社

Book.objects.filter(title="python实战").values("authors__name", "publisher__name")

三:查询jack写过的书,及书籍的出版社信息

Book.objects.filter(authors__name="jack").values("title", "publisher__name")

总结:多表查询的技巧

  • __ : 两个下划线可以生成连接查询(内连接外联接都可以 这里还不懂 ),查询关联的字段信息
  • _set : 提供了对象访问相关表数据的方法。但是这种方法只能是相关类访问定义了关系的类(主键类访问外键类)
书籍类中有一个字段publisher就是引用的出版社类的主键,虽然出版社类中并没有定义书籍有关的信息但是我们还是可以通过_set方法查询到出版社出版的图书----此方法只适用于model对象不适用与QuerySet对象
Publisher.objects.get(name="中国出版社").book_set.all().values("title")

models之聚合查询函数和分组查询函数
在 django.db.models里 使用前需要先导入

  1. annotate(*args, **kwargs):可以为QuerySet中的每个对象添加注解。可以通过计算查询结果中的每个对象所关联的对象集合,从而得出总计值(也可以是平均值等),用于分组查询,annotate前的vaules当作分组条件
  2. aggregate(*args, **kwargs):通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中的每个参数都指定一个包含在字典中的返回值,用于聚合查询

----------使用原生的sql

当业务背景很复杂的时候 orm并不能提供很好的支持这时候就可以使用原生的SQL

  • extra : 结果集修改器,一种提供额外查询参数的机制
  • raw : 执行原始的sql并返回模型实例
  • 直接执行自定义SQL:这种方式完全不依赖model前面两种方式还要依赖于model from django.db import connection
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容