创建表

# 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查询的更多相关文章

  1. Python - Django - ORM 多对多操作

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  2. django ORM多对多操作

    创建多对多: 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = mode ...

  3. Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

    Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...

  4. Django【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

    django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...

  5. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  6. Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...

  7. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

  8. Django ORM那些相关操作

    一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/         官网文档 常用的操作 <1> all() ...

  9. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

随机推荐

  1. 【剑指Offer】删除链表中重复的结点 解题报告(Python)

    [剑指Offer]删除链表中重复的结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...

  2. 第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案

    第五十一个知识点:什么是基于ID的加密的安全模型,然后描述一个IBE方案 在公钥密码学中,如果Alice想要给Bob发送一条消息,她需要Bob的公钥,一般来说公钥都很长,就像一个随机的字符串. 假设A ...

  3. Sublime Text 3结合Chrome实现网页的自动刷新

    我们在编写前端代码时,写好一部分代码时想要看一看代码的实现效果,每次都要手动刷新会非常麻烦,神器来了,LiveReload插件实现网页的实时刷新,操作方法如下: 1. 官网下载Sublime Text ...

  4. CS5266参数|Capstone CS5266|CS5266应用方案

    随着目前手机.笔电和平板类产品都是用的Type-C接口,特别是苹果类的笔电和平板就只有一个Type-C接口,在很多工作.学习.娱乐中突显很多不方便的情况,别是需要一些其他的功能如:鼠标键盘接口USB2 ...

  5. Linux远程操作

    应用场景 公司开发时候,具体的应用场景是这样的1.linux服务器是开发小组共享 正式上线的项目是运行在公网 因此程序员需要远程登录到Linux进行项目管理或者开发 远程登录客户端有Xshell6,X ...

  6. 简单的制作ssl证书,并在nginx和IIS中使用

    2020年最后一篇博文收官,提前祝各位园友新年快乐 现在的后端开发,动不动就是需要https,或者说是需要ssl证书,既然没有正版的证书,那么我们只能自己制作ssl的证书了. 说明:证书的制作采用的是 ...

  7. VoIP语音处理流程和知识点梳理

    做音频软件开发10+年,包括语音通信.语音识别.音乐播放等,大部分时间在做语音通信.做语音通信中又大部分时间在做VoIP语音处理.语音通信是全双工的,既要把自己的语音发送出去让对方听到,又要接收对方的 ...

  8. MYSQL修改配置文件之后无法重启服务

    错误:修改配置文件my.ini之后无法重启服务. 原因:以记事本方式打开my.ini文件修改完之后保存.保存之后文本编码格式为操作系统默认格式utf-8.my.ini格式要是ANSI才可以正常启动服务 ...

  9. 怎样用命令行导入注册表 .reg 文件

    https://stackoverflow.com/questions/49676660/how-to-run-the-reg-file-using-powershell Get-Command re ...

  10. AI系统——机器学习和深度学习算法流程

    终于考上人工智能的研究僧啦,不知道机器学习和深度学习有啥区别,感觉一切都是深度学习 挖槽,听说学长已经调了10个月的参数准备发有2000亿参数的T9开天霹雳模型,我要调参发T10准备拿个Best Pa ...