查询的分类

 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. CentOS装机必备-基本设置以及缺失文件

    主要是虚拟机中安装CentOS每次总会做一些设置,记录下来方便以后. 纯粹基本设置,比如本地SecureCRT可以连接虚拟机中的CentOS. 复杂的非基本设置见:Linux  命令集锦 设置网络 自 ...

  2. Windows pip安装失败:no module named pkg_resources

    通常是Setuptools安装出错,下载以下ez_setup.py文件后,先执行:ez_setup.py -U setuptools 重新安装setuptools 通过此ez_setup.py pip ...

  3. 数据库查询返回Resource id #9后的处理方式

    如果在调用PHP查询数据库,在echo后返回的是Resource id #9,可能你的输出方式是: $sql="SELECT * FROM dbname WHERE id='1'" ...

  4. YourKit Java Profiler安装和破解

    YourKit Java Profiler是业界领先的Java性能剖析工具.其独立版本安装成功且首次启动 YourKit Java Profiler 后,会弹出一个对话框,让用户选择 YourKit ...

  5. [Training Video - 1] [Selenium Basics] [Xpath Selenium]

    FirePath Press F12, you will see :

  6. [Training Video - 1] [Selenium Basics] [What is Selenium IDE,RC,Webdriver, TestNG, Junit And Ant]

    Selenium IDE (Only support in Firefox): - Record and Run - UI interface - User extensions - Conversi ...

  7. wmi收集系统信息 发送到服务器打印

    #include "WMIManager.h" #include <vector> #include <string> #include <boost ...

  8. 2014 ACM/ICPC 鞍山赛区网络赛(清华命题)

    为迎接10月17号清华命题的鞍山现场赛 杭电上的题目 Biconnected(hdu4997)     状态压缩DP Rotate(hdu4998)    相对任一点的旋转 Overt(hdu4999 ...

  9. win10自带虚拟机安装CentOS7系统(转)

    出处:http://blog.csdn.net/bimabushihaodongxi/article/details/53677490 话说工欲善其事,必先利其器,在我准备学习Linux之前先要完成l ...

  10. BZOJ 1503 郁闷的出纳员 (treap)

    1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 13370  Solved: 4808[Submit][Stat ...