博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django ORM 之基于对象、双下划线查询
阅读量:6137 次
发布时间:2019-06-21

本文共 3760 字,大约阅读时间需要 12 分钟。

返回ORM目录 

内容目录:

  一、 基于对象的表查询
  二、 基于双下划线的查询
  三、 聚合查询 aggregate
  四、 分组查询 annotate

一、 基于对象的表查询

1.正向查询  --> 意思是从含有外键表查询其外键对应的表的字段值 --> 正向查询容易推导    (1)查询书籍是三国演义的出版社邮箱        book_obj = models.Book.objects.filter(title='三国演义').first()        结果:123.qq.com            (2)查询书籍是 活着 的作者的姓名        book_obj = models.Book.objects.filter(title='活着').first()        # print(book_obj.authors)  # app01.Author.None 表示查询的数据有多个,需加上all()        print(book_obj.authors.all())        结果:
]> (3)查询作者为jason电话号码 user_obj = models.Author.objects.filter(name='jason').first() print(user_obj.authordetail.phone) 结果:1110
2.反向查询 --> 从外键不在本表开始查询对应关系表的数据 --> 相对要麻烦一点     (1)查询出版社是南方出版社出版的书籍                  一对多字段的反向查询        # 首先要确定的是,书籍与南方出版社是有关系的,但是外键在书籍那边,        # 从出版社开始查询数据,先得到出版社对象,在使用固定语法跨表到book表中,最后拿到数据。        publish_obj = models.Publish.objects.filter(name='南方出版社').first()        print(publish_obj.book_set)  # app01.Book.None        print(publish_obj.book_set.all())​  (2)查询作者jason写过的所有的书                      多对多字段的反向查询        author_obj = models.Author.objects.filter(name='jason').first()        print(author_obj.book_set)  # app01.Book.None        print(author_obj.book_set.all())​   (3)查询作者电话号码是110的作者姓名                   一对一字段的反向查询        authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()        print(authordetail_obj.author.name)

二、 基于双下划线的查询

1.正向查询    (1) 查询书籍为三国演义的出版社地址    res = models.Book.objects.filter(title='三国演义').values('publish__addr','title')         (2) 查询书籍为活着的作者的姓名    res = models.Book.objects.filter(title='活着').values("authors__name",'title')        (3)查询作者为jason的家乡    res = models.Author.objects.filter(name='jason').values('authordetail__addr')
2.反向查询    (1)查询南方出版社出版的书名    res = models.Publish.objects.filter(name='南方出版社').values('book__title')        (2)查询电话号码为120的作者姓名    res = models.AuthorDetail.objects.filter(phone=120).values('author__name')        (3)查询作者为jason的写的书的名字    res = models.Author.objects.filter(name='jason').values('book__title')        (4)查询书籍为三国演义的作者的电话号码    res = models.Book.objects.filter(title='三国演义').values('authors__authordetail__phone')
(1)查询jason作者的手机号 # 正向查询    res = models.Author.objects.filter(name='jason').values('authordetail__phone')     # 反向查询    res = models.AuthorDetail.objects.filter(author__name='jason').values('phone')​(2)查询出版社为东方出版社的所有图书的名字和价格 # 正向查询    res = models.Publish.objects.filter(name='东方出版社').values('book__title','book__price')​ # 反向查询    res = models.Book.objects.filter(publish__name='东方出版社').values('title','price')​(3)查询东方出版社出版的价格大于400的书 # 正向查询    res = models.Publish.objects.filter(name="东方出版社",book__price__gt=400).values('book__title','book__price')  # 反向查询    res = models.Book.objects.filter(price__gt=400,publish__name='东方出版社').values('title','price')

三、聚合查询 aggregate

1.需要先导包from django.db.models import Max,Min,Count,Sum,Avg​2.例子(1)查询所有书籍的作者个数    res = models.Book.objects.filter(pk=3).aggregate(count_num=Count('authors'))​(2)查询所有出版社出版的书的平均价格    res = models.Publish.objects.aggregate(avg_price=Avg('book__price'))​(3)统计东方出版社出版的书籍的个数    res = models.Publish.objects.filter(name='东方出版社').aggregate(count_num=Count('book__id'))​

四、分组查询 annotate

1.例子(1)统计每个出版社出版的书的平均价格    res = models.Publish.objects.annotate(        avg_price=Avg('book__price')).values('name','avg_price')​(2)统计每一本书的作者个数    res = models.Book.objects.annotate(        count_num=Count('authors')).values('title','count_num')    (3)统计出每个出版社卖的最便宜的书的价格    res = models.Publish.objects.annotate(        min_price=Min('book__price')).values('name','min_price')    (4)查询每个作者出的书的总价格    res = models.Author.objects.annotate(        sum_price=Sum('book__price')).values('name','sum_price')

 

 

转载于:https://www.cnblogs.com/xt12321/p/11012907.html

你可能感兴趣的文章
阿里云企业邮箱 在Foxmail 7.0上POP3/IMAP协议设置方法
查看>>
Javascript一些小细节
查看>>
canvas学习总结
查看>>
Javascript的if判断
查看>>
spring cloud gateway 源码解析(3)记录请求参数及返回的json
查看>>
阿里云ECS数据盘格式化与挂载图文教程
查看>>
Flexbox响应式网页布局 - W3Schools视频02
查看>>
【手牵手】搭建前端组件库(二)
查看>>
怎么给视频添加音频或配乐
查看>>
怎么转换音乐格式
查看>>
Leaflet-Develop-Guide
查看>>
每隔1s打印0-5
查看>>
Angular6错误 Service: No provider for Renderer2
查看>>
聊聊flink的BlobStoreService
查看>>
洗牌算法具体指的是什么?
查看>>
HBuilder打包手机app的方法
查看>>
解决Mac下SSH闲时自动中断的问题
查看>>
在JavaScript中理解策略模式
查看>>
ArchSummit 深圳 2017 成功举办,探索未来互联网架构
查看>>
不知道如何提升深度学习性能?我们为你整理了这份速查清单
查看>>