Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询
创建表
# models.py form django.db import models class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的表名
# 如没有自定义主键,django会自动添加一个主键,字段名id 自增
name = models.CharField(max_length=20) # 字段名name 类型 vachar(20)
price = models.IntegerField() # 字段名price 类型int
pub_date = models.DateField() # 字段名pub_date 类型 date (时间戳)
publish = models.ForeighKey('Publish') # 创建外键关联到Publish表的id字段,django会自动将该名称改为publish_id
# 如果这样写 publish = models.ForeighKey(Publish) 括号内无引号,则必须将Publish类放到Book类的上面
authors = models.ManyToManyField('Author',related_name='xxx') 将book与author表做多对多关系 related_name 同一对多中的说明
# django会自动创建一张表(book与author的中间关联表)名称为appname_book_authors
def __str__(self):
return self.name # 打印实例对象时显示为self.name
#class Book_Author(models.Model): 自己创建第三张表
# book = models.ForeignKey('book')
# author = models.ForeignKey('Author')
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
def __str__(self):
return self.name

多对多的添加设置删除

# views.py from django.shortcuts import render
from app_name.models import * # 导入models.py def add(request): # 增加数据的视图函数
# 系统自己创建的第三张表使用创建对象操作
book_obj = Book.objects.get(id=4) # 取出id为4的书
# book_obj.authors.all() 此时取出的是一个空的集合
authors_obj = Author.objects.all() # 取出所有author名称的集合
book_obj.authors.add(*author_obj) # 将所有作者添加到这本书中
book_obj.authors.remove(*author_obj) # 将所有作者从书中删除
book_obj.authors.add(2) # 将id为2的作者添加到此书
book.obj.authors.add([1,2]) # 将id为1和2的作者添加到此书
book_obj.authors.remove(1) # 将id为1的作者从书中删除
book_obj.authors.clear() # 清除此书所有的作者
book_obj.authors.set([2,3,4]) # 将书的作者设置为id为2,3,4的作者 (相当于重新设置)
# 我们自己定义的第三张表(不常用)
Book_Author.objects.create(book_id=2, author_id=3)
obj = Book.objects.get(id=2)
obj.book_author_set.all()[0]l.author
return HttpResponse('xxx')

多对多的查询

# 怎么使用多对多查询呢?
book_obj = Book.objects.get(name='python')
print(book_obj.name) # python
print(book_obj.authors.all()) # QuerySet 返回一个QuerySet对象,里面是author的实例集合
print(type(book_obj.authors.all())) # <class 'django.db.models.query.QuerySet'>
1、查询作者id为2出的所有的书
author_obj=Author.objects.get(id=2)
author_obj.book_set.all()
2、查询三班所对应的所有老师
obj = Classes.objects.filter(name='三班').first() 从班级表取出三班
obj.m.all() # 从三班中取所有的老师 m表示多对多关系的名称
还是通过双下划线
2、查询作者alex出的所有书
Book.objects.filter(authors__name='alex').values('name','price')

使用聚合函数和分组

# views.py
from django.db.models import Avg,Min,Sum,Max,Count
# 聚合函数
# 取出所有书总价格的平均值
Book.objects.all().aggregate(Avg('price')) # 必须使用aggregate函数
# 取alex出的书的总价格
Book.objects.filter(author__name='alex').aggregate(alex_money=Sum('price')) # {'alex_money':166}
# 取alex出的书的数量
Book.objects.filter(author__name='alex').aggregate(alex_count=Count('price')) # {'alex_count':2}
# 分组
# 每一个作者出的书的总价
Book.objexts.values('author__name').annotate(Sum('price')) # QuerySet [{'price__sum':211, 'authors__name':'alex'},...]
# 查每个出版社最便宜书的价格
Publish.bojects.values('name').annotate(Min('book__price'))

F查询和Q查询
针对的问题:1、在filter中定义的条件只能是and操作没有or和not 2、如果要将所有书的价格都加上10 用price=price+10是不行的

from django.db.models import Q,F
#第一个问题
Book.objects.filter(Q(price=87)|Q(name='linux')) # select * from book where (price=87 or name='linux')
Book.objects.filter(~Q(name='linux')) # select * from book where name != 'linux'
#第二个问题
Book.objects.all().update(price=F('price')+10)
关键字查询与F,Q查询一起使用时,必须将F,Q查询放在前面
Book.objects.filter(Q(name='Go'),price=87)
Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询的更多相关文章
- Python - Django - ORM 多对多操作
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- django ORM多对多操作
创建多对多: 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = mode ...
- Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作
Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...
- Django【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)
django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...
- Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
- Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...
- Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询
一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增 create publish_id 传数字 (publish_id是数据库显示的字段名 ...
- Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 官网文档 常用的操作 <1> all() ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
随机推荐
- 【LeetCode】152. Maximum Product Subarray 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 动态规划 参考资料 日期 题目地址:htt ...
- 【LeetCode】779. K-th Symbol in Grammar 解题报告(Python)
[LeetCode]779. K-th Symbol in Grammar 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingz ...
- 【LeetCode】709. To Lower Case 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述: 题目大意 解题方法 ASIIC码操作 日期 题目地址:https:// ...
- java 堆、栈
堆: 1)Java的堆是一个运行时数据区,类的对象从堆中分配空间.这些对象通过new等指令建立,通过垃圾回收器来销毁. 2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它 ...
- BP网络简单实现
目录 BP算法的简单实现 Linear 全连接层 ReLu MSELoss 交叉熵损失函数 BP算法的简单实现 """ BPnet 简易实现 约定输入数据维度为(N, i ...
- 编写Java程序,创建Dota游戏中的防御塔类,通过两个坐属性显示防御塔所在的位置
返回本章节 返回作业目录 需求说明: 创建Dota游戏中的防御塔类 通过两个坐属性显示防御塔所在的位置 实现思路: 创建防御塔(TowerDefense)类 在该类中定义了两个属性,分别是int类型横 ...
- 编写Java程序,使用 Java 的 I/O 流将 H:\eclipse.zip 文件拷贝至 E 盘下,重新命名为 eclipse 安装 .zip。
查看本章节 查看作业目录 需求说明: 使用 Java 的 I/O 流将 H:\eclipse.zip 文件拷贝至 E 盘下,重新命名为 eclipse 安装 .zip.在拷贝过程中,每隔2000 毫秒 ...
- 如何跳出springboot的service层中某一个方法?
有一个需求,就是中断某个方法中的for循环 目前的做法是:for循环中,增加if判断,如果满足条件就return,会中断这个方法 for (int i = 0; i < totalIndex; ...
- Jenkins_构建任务提示找不到命令的处理方法
问题现象 部署pytest环境后,在linux上能执行命令,但是使用jenkins构建就提示找不到命令. 问题分析 可能是...jenkins中执行时,默认使用的是linux中的jenkins用户权限 ...
- docker的无用镜像
dangling images build 自己的 docker 镜像的时候,有时会遇到用一个甚至多个中间层镜像,这会一定程度上减少最终打包出来 docker 镜像的大小,但是会产生一些tag 为 n ...