查询的分类

 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. Python time、datetime

    简介: 记录一下 Python 如何获取昨天.今天.明天时间及格式化. 1.今天 In [1]: import time In [2]: print time.strftime('%Y.%m.%d', ...

  2. 归纳整理Linux下C语言常用的库函数----时间日期数学及算法

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  3. 在Spring使用junit注解进行单元测试

    在Spring中可以使用junit配合注解进行单元测试 一.常用注解 1.@RunWith(SpringJUnit4ClassRunner.class),让测试运行于spring测试环境2.@Cont ...

  4. FILTER:progid:DXImageTransform.Microsoft.Gradient使用

    FILTER:progid:DXImageTransform.Microsoft.Gradient使用 语法: filter:progid:DXImageTransform.Microsoft.Gra ...

  5. ajax406错误

    如上,ajax请求时一直返回error,但是后台已经正确返回.网上给出的解决办法是spring3.*的,但我的是sppring 4.*的,应该不适用,我也没试. 思索一下,406 not accept ...

  6. 1-求组合数(c(n, m))的几种方法

    1.求C(n, m) 动态规划(递归+记忆数组) 递推关系为:C(n, m) = C(n-1, m) + C(n - 1, m - 1),C(n, m)表示为从n个数中选出m个出来,可以基于最后一个元 ...

  7. day25 map,filter,reduce 内置函数,作业

    =====================作业一#用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sbname=['alex','wupeiqi','yuanhao']###### ...

  8. <<高级计算机网络>>(Advaned Computer Networks) 徐恪 徐明伟 陈文龙 马东超

    目录 第1章 计算机网络与Internet1 1.1 引言1 1.2 Internet发展历史2 1.2.1 互联网发展的主要阶段4 1.2.2 互联网在中国的发展5 1.2.3 互联网主要创新5 1 ...

  9. GO语言使用gopsutil包进行机器信息采集

    GO语言本身拥有极强的性能,非常适合做一些后端的数据采集管理以及运维系统. 其中会面临对当前系统信息的采集,我在这里使用的是GO的工具包 gopsutil 贴出一套测试代码,抛砖引玉: import ...

  10. WAMP不能启动, 一直处于红色图标或者橙色图标的解决办法

    WAMP不能启动, 一直处于红色图标(正常启动为绿色吧) 考虑是端口的问题,我找到wamp文件夹中的wamp\bin\apache\apache2.2.22\conf路径下的httpd.conf文件, ...