多表查询
Posted liangchengyang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多表查询相关的知识,希望对你有一定的参考价值。
创建多表模型
一对一的关系:OneToOneField
一对多的关系:ForeignKey
多对多的关系:ManyToManyField
添加表记录
1 一对多新增
-两种方式:
-publish=对象
-publish_id=id
2 一对多删除:同单表删除
3 一对多修改:两种方式,可以传对象,可以传id
4 一对一跟一对多一样
5 多对多:
-add ----->可以传对象,可以传id,可以传多个
-remove ----->可以传对象,可以传id,可以传多个
-clear ---->没有参数
-set ----->跟上面不一样,必须传列表,列表里面可以是对象,可以是id
基于对象的表查询
1 一对一
正向:正向查询按字段
反向:反向查询按表名小写
2 一对多
正向:正向查询按字段
反向:反向按表名小写_set.all()
3 多对多
正向:正向查询按字段.all()
反向查询:反向按表名小写_set.all()
4******基于对象的查询,多次查询(子查询)
基于双下划线的跨表查询
-连表查询
-一对一双下划线查询
-正向:按字段,跨表可以在filter,也可以在values中
-反向:按表名小写,跨表可以在filter,也可以在values中
聚合查询
# 计算所有图书的平均价格
from django.db.models import Avg
Book.objects.all().aggregate(Avg(‘price‘))
aggregate()是QuerySet的一个终止子句,意思是说,它返回一个包含一些键值对的字典。
分组查询
# 统计每一本书作者个数
res=Book.objects.all().annotate(c=Count(‘authors‘)).values(‘name‘,‘c‘)
print(res)
终极总结:
values在前,表示group by,在后,表示取值
filter在前,表示过滤(where),在后,表示having(对分组之后的结果再进行过滤)
终极总结:
values在前,表示group by ,灾后表示取值
filter在前,表示where(过滤),在后表示having(对分组之后的结果在进行过滤)
F查询与Q查询
F查询
1.为了实现某个字段的值与另一个字段的值相比较
2.实现数据修改操作
Q查询
为了构造与&,或|,非~的关系
filter的条件都是and关系 可以通过Q函数实现与或非
以上是关于多表查询的主要内容,如果未能解决你的问题,请参考以下文章