一篇文章带你了解Django ORM操作(进阶篇)

回顾

上次咱们学习了一下Django ORM的基本查询操作。

查询操作主要使用的是filter()方法。

我们知道filter()查询出来的是值,如果想取第一个值需要再filter().first()才行。

还知道了get()filter().first()的区别等等。

Django ORM的查询还有很多,继续来看叭!!!

查询操作

对象.外键字段

比如,我们拿到了一个书的信息,我们可以这样打印他的信息。

代码

1 2book = models.Book.objects.filter(title="<<大明帝国>>").first() 3print(f"book类型:{type(book)}") 4print(f"id:{book.id}") 5print(f"书名:{book.title}") 6print(f"价格:{book.price}") 7print(f"书名:{book.PublishDate}") 8print(f"出版社:{book.publish}") # 外键字段

执行结果

注:蓝色为外键字段

不知道你有没有疑问,为什么book.publish会把邮电出版社打印出来

这个原因主要在于外键对象的__str__方法。

就是因为我Publish返回的是self.title,所以才能打印出来邮电出版社,如果我想打印出版社联系方式咋办?

代码

1print(f"出版社类型:{type(book.publish)}") # <class 'web.models.Publish'> 2# book.publish已经是models.Publish对象,所以可以自由调里面的属性 3print(f"出版社电话:{book.publish.phone},")

执行结果

总结

对象.外键字段拿到的就是外键字段对象,直接就可以通过对象.外键字段.外键属性获取具体值。

反向查询(表名__set.all())

上述我们是通过正向查询的方式查询到了书对应的出版社具体信息

但是如果说,我们拿到的就是一个出版社名呢?

通常情况下,你可能会这样!

代码

1# 查询邮电出版社 2publish_obj = models.Publish.objects.filter(title="邮电出版社").first() 3# 获取出版社id 4publish_id = publish_obj.id 5# 查询publish_id为出版社id的 6book_list = models.Book.objects.filter(publish_id=publish_id) 7print(book_list)

执行结果

其实,还有一种方法:通过一个对象,反向查多个对象。

代码

1publish_obj = models.Publish.objects.filter(title="邮电出版社").first() 2book_list = publish_obj.book_set.all() 3print(book_list)

执行结果

双下划线跨表查询

还是上述这个问题,通过一个出版社名,查找属于这个出版社的图书

基于双下划线的跨表查询,理论是更简单的!

注: 可以看到还有__contains等其他filter条件查询,通过__跨表依然是可以通用的。

代码

1 2book_list = models.Book.objects.filter(publish__title="邮电出版社") 3print(book_list)

执行结果

连续跨表

__不仅可以进行跨一张表,还能跨多张表。

图书Many作者表为例,根据出版社查询图书和作者多对多的信息。

代码

1 2ret = models.BookManyAuthor.objects.filter(book__publish__title="邮电出版社") 3print(ret)

跨了book表又跨了publish表

执行结果

values

有时候,我们可能只需要一些特定的列,这时候使用values即可。

代码

1 2# 语法 3book_list = models.Book.objects.all().values("列1","列2",...) 4# 示例 5book_list = models.Book.objects.all().values("title","price") 6print(book_list)

代码

values返回的值有点像列表套字典,但是其实本质还是QuerySet类型。

values_list

values_listvalues功能一样,都是取相关的列,但是返回的类型格式不一样。

代码

1 2book_list = models.Book.objects.all().values_list("title","price") 3print(book_list)

执行结果

这个有点像列表套元组,但是其实本质还是QuerySet

related_name

related_name通常用于反向查询时,替换<表名>_set

原方式

models.py

代码

1 2# 查询邮电出版社 3publish = models.Publish.objects.filter(title="邮电出版社").first() 4print(publish) 5# 反向一对多 6book_list = publish.book_set.all() 7print(book_list)

执行结果

别名方式

models.py

代码

1 2# 查询邮电出版社 3publish = models.Publish.objects.filter(title="邮电出版社").first() 4print(publish) 5# 反向一对多 6book_list = publish.book_list.all() 7print(book_list)``` 8 9**执行结果** 10 11![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/01c173c215ed5e11b897ddea43fa287e.png) 12 13### filter().filter()... 14 15上文我们说过,是支持多个filter的,`filter(<条件>).filter(<条件>)...` 16 17这种情况通常用于**不确定筛选条件**,但是**多层筛选**的情况下。 18 19**代码** 20

举例而已,后面filter里面可以是其他 或 的条件

book1 = models.Book.objects.filter(title="<<大明帝国>>").filter(price="99")

效果同上

book2 = models.Book.objects.filter(title="<<大明帝国>>",price="99") print(book1) print(book2)

1 2**执行结果** 3 4![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/b2bcb92b02c8fadb4a86f2dfcd6960c6.png) 5 6总结 7 8----- 9 10本篇主要还是上篇的继续补充,还是关于`filter`的查询部分。 11 12本次主要有**外键字段类型**,反向查询**默认**使用`<表名>__set`,还可以使用`related_name`反向字段查询。 13 14双下划线可以进行条件查询,还可以进行跨表查询,还可以连续跨表,values和values\_list区别。 15 16多个`filter`进行条件筛选。 17 18如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。 19 20用微笑告诉别人,今天的我比昨天强,今后也一样。 21 22如果觉得还不错,记得动手点赞一下哈。感谢你的观看。 23 24 25 26如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~ 27 28想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~ 29 30**********\---**\--************\---****\---**********\---**\--************\---************************************ End **********\---**\--************\---**\--**\---**********\---**\--************\-************************************ 31 32往期精彩文章推荐: 33 34* [手把手教你用Python制作简易小说阅读器](http://mp.weixin.qq.com/s?__biz=MzU3MzQxMjE2NA==&mid=2247490914&idx=1&sn=d8d65ee63b5dcee5794dfb982eb9d9e3&chksm=fcc35b49cbb4d25f051b3512e204b2e782131329b7a2dcab3e527ef3d77c901b9957555cf66e&scene=21#wechat_redirect) 35 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 36 37* [一篇文章总结一下Python库中关于时间的常见操作](http://mp.weixin.qq.com/s?__biz=MzU3MzQxMjE2NA==&mid=2247490901&idx=1&sn=7e20ac4d4fd9c41b363cf85e679774b7&chksm=fcc35b7ecbb4d268fde21f590030bac79f683cdd658623c794916e5b880846917d275da9292b&scene=21#wechat_redirect) 38 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 39 40* [盘点5种基于Python生成的个性化语音方法](http://mp.weixin.qq.com/s?__biz=MzU3MzQxMjE2NA==&mid=2247490818&idx=1&sn=c2e8a0433baaafe751ddebca7716ad80&chksm=fcc35b29cbb4d23f3cbe40202c5f7e15e9363507ba4305ce9b13993dc85ba82826377bcdb5e4&scene=21#wechat_redirect) 41 42 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 43 44 45![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/89a08974fd8f81c99b24e80da5c93755.png) 46 47欢迎各位大佬点击链接加入群聊【**helloworld开发者社区**】:[https://jq.qq.com/?_wv=1027&k=mBlk6nzX](https://jq.qq.com/?_wv=1027&k=mBlk6nzX)进群交流IT技术热点。 48 49 50 51 52本文转自 [https://mp.weixin.qq.com/s/dkofEfG81isLYt2l-Ln8eA](https://mp.weixin.qq.com/s/dkofEfG81isLYt2l-Ln8eA),如有侵权,请联系删除。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

​一篇文章总结一下Python库中关于时间的常见操作

前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在