查询的分类

 class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() # 与AuthorDetail建立一对一的关系
ad = models.OneToOneField(to="AuthorDetail") class AuthorDetail(models.Model):
birthday = models.DateField()
telephone = models.BigIntegerField()
addr = models.CharField(max_length=64) class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField() class Book(models.Model): title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
keepNum = models.IntegerField()
commentNum = models.IntegerField() # 与Publish建立一对多的关系,外键字段建立在多的一方
publish = models.ForeignKey(to="Publish", to_field="nid") # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任
#意一个,自动创建第三张表
authors = models.ManyToManyField(to='Author') 三个关联字段: # 与AuthorDetail建立一对一的关系
ad = models.OneToOneField(to="AuthorDetail") # 与Publish建立一对多的关系,外键字段建立在多的一方
publish = models.ForeignKey(to="Publish", to_field="nid") # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的 任意一个,自动创建第三张表
authors = models.ManyToManyField(to='Author')

表关系

  基于对象的查询(子查询)

    查询思想:

      首先得到一个对象,通过此对象进行正向查询或者反向查询。

    使用条件:

      使用的前提必须是一个对象,在一对多与多对多的环境下才能使用对象.表名小写_set().all();在一对一的环境下,使用对象.表明小写

    一对一

      正向按照字段:对象.外键字段.字段

      表一---------------------------->表二

      表一<----------------------------表二

      反向按照表名:对象.表名小写.字段

示例:

 #查询作者阿童木的邮箱地址(正向)
auth_obj = Author.objects.filter(name="阿童木").first()
print(auth_obj.detail.email) #查询邮箱以“1”开头的坐着的姓名(反向)
detail_obj = Author_detail.objects.filter(email__startswith="").first()
print(detail_obj.author.name)

注意:

  在一对一的关系中,不管是正向还是反向查询得到的只能是一个结果,因此不需要加"_"。

  但是在一对多或多对多的关系中,一 的一方找多的一方,正向使用"对象.字段"的格式进入另一张表,反向使用“对象.表名小写_set”进入另一张表。

     一对多 

       正向按照字段:对象.外键字段.字段

      表一---------------------------->表二

      表一<----------------------------表二

       反向按照表名小写:对象.表名小写_set.字段

示例:

 #查询“葵花宝典”这本书的出版社的名称(正向)
book_obj = Book.objects.filter(title="葵花宝典").first()
book_obj.publisher.name #查询“北京邮电出版社”出版的所有书籍的名称(反向)
publish_obj = Publish.objects.filter(name="北京邮电出版社").first()
publish_obj.book_set.values("title")

    多对多 

          正向按照字段

      表一---------------------------->表二

      表一<----------------------------表二

          反向按照表名小写_set()

示例:

 #查询“葵花宝典”这本书的所有作者的姓名和年龄(正向)
book_obj = Book.objects.filter(title="葵花宝典").first()
book_obj.author.all().values("name","age") #查询“阿童木”所出版的所有书的名称和价格(反向)
author_obj = Author.objects.filter(name="阿童木").first()
author_obj.book_set.all().values("title","price")

  基于Queryset的查询(连表查询)

    注意:

      在使用基于QuerySet的双下划线进行查询的时候,不管是一对一,一对多还是多对多,都使用表名小写__字段。

      一对一

        正向按照字段:Queryset.values("外键字段__字段")

        表一---------------------------->表二

        表一<----------------------------表二

        反向按照表名:Queryset.values("表名小写__字段")

示例:

 #查询作者为“阿童木”的邮箱地址(正向)
Author.objects.filter(name="阿童木").values("detail__email") #查询邮箱以“1”开头的作者姓名
Author_detail.objects.filter(email__startswith="").values("author__name")

      一对多

        正向按照字段:对象.外键字段.字段

        表一---------------------------->表二

        表一<----------------------------表二

        反向按照表名:Queryset.values("表名小写__字段")

示例:

 #查询"葵花宝典"这本书的出版社的名称和所在城市(正向)
Book.objects.filter(title="葵花宝典").values("publisher__name","publisher__city") #查询“北京邮电出版社”所出版的所有书籍的名称和价格(反向)
Publish.objects.filter(name="北京邮电出社").values("book__title","book__price")

      多对多 

        正向按照字段:对象.外键字段.字段

        表一---------------------------->表二

        表一<----------------------------表二

        反向按照表名:Queryset.values("表名小写__字段")

示例:

 #查询“葵花宝典”这本书的作者名称和email(正向,两次跨表)
Book.objects.filter(title="葵花宝典").values("author__name","author__detail__email") #查询阿童木的出版的所有书籍的名称和价格(反向)
Author.objects.filter(name="阿童木").values("book__title","book__price")

聚合

 from django.db.models import Avg,Sum,Count,Max,Min
# 1、查询所有图书的平均价格
print(models.Book.objects.all().aggregate(Avg("price")))

aggregate()QuerySet 的一个终止子句(也就是返回的不再是一个QuerySet集合的时候),意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

 # 1、查询所有图书的平均价格
print(models.Book.objects.all().aggregate(avgprice = Avg("price")))

如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数。所以,如果你也想知道所有图书价格的最大值和最小值,可以这样查询:

 print(models.Book.objects.all().aggregate(Avg("price"),Max("price"),Min("price")))
#打印的结果是: {'price__avg': 174.33333333333334, 'price__max': Decimal('366.00'), 'price__min': Decimal('12.00')}

分组

 #查询每一个出版社出版过的书籍数量和出版社名称
Publish.objects.all().annotate(c=Count("book")).values("name","c")

ORM的查询操作的更多相关文章

  1. Django的ORM常用查询操作总结(Django编程-3)

    Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...

  2. Django视图之ORM数据库查询操作API

    查询表记录 查询相关API 操作:models.表名.objects.方法() all(): 查询所有结果 filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 get(**kwar ...

  3. ORM数据库查询操作之基于双下划线的跨表查询

     创建表结构 from django.db import models class Book(models.Model): title=models.CharField(max_length=32) ...

  4. Django--数据库查询操作

    MySQL是几乎每一个项目都会使用的一个关系数据库,又因为它是开源免费的,所以很多企业都用它来作为自家后台的数据库. BAT这类大公司除外,它们的业务数据是以亿级别来讨论的,而MySQL的单表6000 ...

  5. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

  6. Django ORM (三) 查询,删除,更新操作

    ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...

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

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

  8. day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询

    目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...

  9. 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)

    一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段   示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...

随机推荐

  1. VS2008项目移植到Linux

    不少人都遇到过这种情况:在Windows下用Visual Studio工具开发的程序需要移植到Linux系统中,做成Linux版本的,但程序比较大,在Linux上又离不开Make,手动编写Makefi ...

  2. JS是面向过程、面向对象还是基于对象?面向对象的代码体现

    一.问题 javascript是面向对象的,还是面向过程的?基于对象是什么意思? 对象: 指的是对某一类事物进行抽象,抽象出这一类事物共同的特征以及行为(也就是属性和方法),那些拥有这一共同属性和方法 ...

  3. 使用rem的原理,62.5%,根据屏幕宽度等比压缩网页

    一.前言 我们在编写网页时,往往需要兼顾网页在不同屏宽情况下的显示 而有时为了省事,没时间写新的页面,也为了兼容考虑,这就需要使用等比压缩了 等比压缩的核心是rem 二.正文 (一).rem的使用   ...

  4. 和大于S的最小子数组 · Minimum Size Subarray Sum

    [抄题]: 给定一个由 n 个正整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组.如果无解,则返回 -1. 给定数组 [2,3,1,2,4,3] 和 s = 7, 子 ...

  5. Kafka管理工具介绍

    Kafka内部提供了许多管理脚本,这些脚本都放在$KAFKA_HOME/bin目录下,而这些类的实现都是放在源码的kafka/core/src/main/scala/kafka/tools/路径下. ...

  6. shell如何传递变量到另一个脚本文件中

    http://www.jbxue.com/article/shell/20707.html本文介绍了shell脚本传递变量到另一个脚本文件中的方法,在脚本中调用另一脚本,即创建了一个子进程,感兴趣的朋 ...

  7. java高级工程师(二)

    一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是 DispatcherServlet , 一个请求经过 Dispatc ...

  8. MVC过滤器实现用户登录验证

    前言当我们访问某个网站的时候需要检测用户是否已经登录(通过Session是否为null),我们知道在WebForm中可以定义一个BasePage类让他继承System.Web.UI.Page,重写它的 ...

  9. websocket客户端实现

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Java程序设计17——多线程-Part-C

    11 使用管道流 前面介绍的两种方式与其称为线程之间的通信,还不如称为线程之间协调运行的控制策略.如果需要在两条线程之间进行更多的信息交互,则可以考虑使用管道流进行通信. 管道流有3中存在形式:Pip ...