Django连表查询

本文深入探讨了Django框架中的连表查询技术,详细解释了如何使用`select_related()`和`prefetch_related()`进行高效的数据检索。通过实例,展示了如何减少数据库交互次数,提升查询性能,以及在复杂查询场景下如何结合使用这两个方法实现数据的联合查询。
```bash
外键字段的增删改查
 #一对一,一对多,跨表"""一个作者对应多本书籍add在第三张关系表中添加数据  括号类即可以传主键字段也可以传数据对象,并且都支持传多个"""增:author_obj=models.Author.object.filter(pk=1).first()  author_obj.books.add(1,2)"""一个作者只针对了一个作者  但是set里面传入的数据应该是可迭代对象列表或者元祖,  整数等不可使用"""改:  author_obj.books.set([1,])  author_obj.books.set([1,2])"""remove移除指定不需要的数据,()不能跟元祖或者列表,支持传入多个数据"""删:  author_obj.books.remove(1)清空数据:  author_obj.books.clear()#清空当前作者和书籍的所有绑定关系()不需要传入任何数据
```
正反向查询的概念

```bash
正向查询
	书籍对象查出版社对象  外键字段在书表中#正向查询
 	书籍对象查作者对象  外键字段在书表中
  作者对象查作者详情 外键字段在作者中
  
  
反向对象
	出版社查书籍对象  外键字段不在出版社表中
  作者查书籍对象   外键字段不在作者表中
  作者详情查作者   外键字段不在作者详情
  
 """
 总结:
 	正反向的判断依据是,外键字段是否有直接关系
 	口诀:正向查询按外键字段,反向查询按表名小写。。。。
 """
```
基于对象的跨表查询(子查询)

```bash
""" 将一条SQL语句的查询结果当作另外一条SQL语句的查询条件"""
#查询主键为2的书籍对应的出版社
"""
基于对象的跨表查询
1.先查询书籍对象
2.在基于书籍对象查询出版社对象(书跟出版社的外键字段,在书中,所以是正向查询)
"""
book_obj=models.books.object.filter(pk=2).first
res=book_obj.publish
print(res)

#2.查询主键为3的书籍对应的作者
"""
1.先查询书籍3的书籍对象
2.在基于书籍对象查询对应的作者
3.存在多对多和一对一等关系.all()查询出所有的作者对象
"""
book_obj=models.books.object.filter(pk=3).first()
res=book_obj.authors.all()

#3.查询jason的详情数据
"""
1.先查找jason对象
2.在查找details详情表中关联Jason的数据,最后打印Jason的详情数据
"""
author_jason=models.authors.object.filter(name='jason').first()
res=author_jason.details.all()
for item in res
	print(item)
#小总结:基于对象的正向查询,数据对象点了外键字段之后,是否需要all取决于关联的数据项有几个,单个无需all

#4.查询北方出版社出版的书籍
"""
1.先查询北方出版社
2.在查询出关联的书籍
3.反向查询,表名小写加_set.all()
"""
north_shop=models.books_shop.object.filter(title='北方出版社').first()
res=north_shop.book_set.all()
#5.查询jason写过的书籍
"""
1.先查询jason对象
2.在基于jason查询书籍对象,Jason对象和书籍的外键字段在书籍表中,所以为反向
"""
jason_obj=models.authors.object.filter(name='jason').first
res=jason_obj.book_set.all()
#6.查询电话是110的作者姓名
"""
1.先查询出电话是110的对象
2.在基于110对象,110对象和作者对象的外键字段在作者表中,所以为反向
"""
police_obj=models.Phone.object.filter(num='110').first()
res=polisce_obj.author
```
基于双下划线的跨表查询(联表操作)

```bash
#1.查询主键为2的书籍对应的出版社对应的关系,一句话结束
res=models.Books.object.filter(pk=2).values('publish__name','publish__addr')

#2.查询主键为3的书籍对应的作者
book_obj=models.Books.object.filter(pk=3).values('Author__name')
#3.查询北方出版社出版的书籍
res=models.Pubilsh.object.filter(name='北方出版社').values('book__title')

双下划线进阶操作

#1.查询主键为2的书籍对应的出版社,不能点书籍
res=models.Publish.object.filter(book__pk=2)
```
聚合查询和分组查询

```bash
聚合函数
	max min sum count avg
  使用聚合函数需要导模块  
  from django.db.models import max min sum count avg
  聚合查询的关键词 aggregate
  eg:
 res=models.Book.objects.aggregate(Max('price'),Min('price'))
    
分组查询:关键词annotate
	#统计每一本书的作者个数
 res=models.Book.objects.annotate(author_num=Count('authors__pk')).values('author_num','title')
	#统计出每个出版社卖的最便宜的书的价格
 res=models.Book_shop.objects.annotate((min_price=Min('book__price')).values('min_price','title')
	#统计不止一个作者的图书
  """
  以书为基准,按书分类
  作者数为查询关键,过滤掉等于1的作者数的书
  """
 res=models.book.objects.annotate(author_num=Count('authors__pk')).filter(author_num__gt=1)
	#查询各个作者出的书的总价格
  """
  以作者为基准,按作者分类
  每个作者对应的书为查询的关键,计算每个作者书的价格
  """
 res=models.Author.objects.annotate(prince_sum=Sum('book__price')).values('name','price_sum')
                                       
"""
小总结:
1.大的分组
	models.表名.objects.annotate  按照models后面的表名分组(主键)
2.小的分组
	models.表名.objects.values('price').annotate()
"""
```
F查询和Q查询

```bash
F功能是获取数据库中字段原有的数据
如何导入F查询
from django.db.models import F
#字段加后缀
from django.db.models.functions import Concat
from django.db.models import Value
eg:将所有书籍的价格提升100元
res=models.Book.objects.update(price=F('price')+100)
"""
本段语法翻译,将所有书含有字段price的都加100更新
"""


```

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值