文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 14:19

关注

回顾

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

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

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

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

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

查询操作

对象.外键字段

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

代码

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

执行结果

 

注:蓝色为外键字段

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

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

 

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

代码

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

执行结果

 

总结

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

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

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

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

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

代码

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

执行结果

 

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

代码

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

执行结果

 

双下划线跨表查询

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

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

 

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

代码

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

执行结果

 

连续跨表

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

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

代码

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

跨了book表又跨了publish表

 

执行结果

 

values

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

代码

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

代码

 

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

values_list

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

代码

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

执行结果

 

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

related_name

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

原方式

models.py

 

代码

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

执行结果

 

别名方式

models.py

 

代码

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

执行结果

 

filter().filter()...

上文我们说过,是支持多个filter的,filter(<条件>).filter(<条件>)...

这种情况通常用于不确定筛选条件,但是多层筛选的情况下。

代码

  1. # 举例而已,后面filter里面可以是其他 或 的条件 
  2. book1 = models.Book.objects.filter(title="<<大明帝国>>").filter(price="99"
  3. # 效果同上 
  4. book2 = models.Book.objects.filter(title="<<大明帝国>>",price="99"
  5. print(book1) 
  6. print(book2) 

执行结果

 

总结

本篇主要还是上篇的继续补充,还是关于filter的查询部分。

本次主要有外键字段类型,反向查询默认使用<表名>__set,还可以使用related_name反向字段查询。

双下划线可以进行条件查询,还可以进行跨表查询,还可以连续跨表,values和values_list区别。

多个filter进行条件筛选。

如果在操作过程中有任何问题,记得下面留言,我们看到会第一时间解决问题。

用微笑告诉别人,今天的我比昨天强,今后也一样。

本文转载自微信公众号「Python爬虫与数据挖掘」,可以通过以下二维码关注。转载本文请联系Python爬虫与数据挖掘公众号。

 

来源: Python爬虫与数据挖掘 内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯