前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇文章带你了解Django ORM操作(进阶篇)

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

作者头像
Python进阶者
发布2021-01-06 14:44:36
4360
发布2021-01-06 14:44:36
举报

回顾

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

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

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

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

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

查询操作

对象.外键字段

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

代码

代码语言:javascript
复制
book = models.Book.objects.filter(title="<<大明帝国>>").first()
print(f"book类型:{type(book)}")
print(f"id:{book.id}")
print(f"书名:{book.title}")
print(f"价格:{book.price}")
print(f"书名:{book.PublishDate}")
print(f"出版社:{book.publish}") # 外键字段

执行结果

注:蓝色为外键字段

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

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

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

代码

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

执行结果

总结

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

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

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

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

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

代码

代码语言:javascript
复制
# 查询邮电出版社
publish_obj = models.Publish.objects.filter(title="邮电出版社").first()
# 获取出版社id
publish_id = publish_obj.id
# 查询publish_id为出版社id的
book_list = models.Book.objects.filter(publish_id=publish_id)
print(book_list)

执行结果

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

代码

代码语言:javascript
复制
publish_obj = models.Publish.objects.filter(title="邮电出版社").first()
book_list = publish_obj.book_set.all()
print(book_list)

执行结果

双下划线跨表查询

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

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

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

代码

代码语言:javascript
复制
book_list = models.Book.objects.filter(publish__title="邮电出版社")
print(book_list)

执行结果

连续跨表

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

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

代码

代码语言:javascript
复制
ret = models.BookManyAuthor.objects.filter(book__publish__title="邮电出版社")
print(ret)

跨了book表又跨了publish表

执行结果

values

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

代码

代码语言:javascript
复制
# 语法
book_list = models.Book.objects.all().values("列1","列2",...)
# 示例
book_list = models.Book.objects.all().values("title","price")
print(book_list)

代码

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

values_list

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

代码

代码语言:javascript
复制
book_list = models.Book.objects.all().values_list("title","price")
print(book_list)

执行结果

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

related_name

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

原方式

models.py

代码

代码语言:javascript
复制
# 查询邮电出版社
publish = models.Publish.objects.filter(title="邮电出版社").first()
print(publish)
# 反向一对多
book_list = publish.book_set.all()
print(book_list)

执行结果

别名方式

models.py

代码

代码语言:javascript
复制
# 查询邮电出版社
publish = models.Publish.objects.filter(title="邮电出版社").first()
print(publish)
# 反向一对多
book_list = publish.book_list.all()
print(book_list)

执行结果

filter().filter()...

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

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

代码

代码语言:javascript
复制
# 举例而已,后面filter里面可以是其他 或 的条件
book1 = models.Book.objects.filter(title="<<大明帝国>>").filter(price="99")
# 效果同上
book2 = models.Book.objects.filter(title="<<大明帝国>>",price="99")
print(book1)
print(book2)

执行结果

总结

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

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

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

多个filter进行条件筛选。

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

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

如果觉得还不错,记得动手点赞一下哈。感谢你的观看。

如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~

想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~

------------------- End -------------------

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python爬虫与数据挖掘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回顾
  • 查询操作
    • 对象.外键字段
      • 总结
    • 反向查询(表名__set.all())
      • 双下划线跨表查询
        • values
          • values_list
            • related_name
              • 原方式
              • 别名方式
            • filter().filter()...
            • 总结
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档