查询的分类

 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. 用JDK自带的包来解析XML文件(DOM+xpath)

    DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom.org.xml.sax 和javax.xml.parsers包就可以满意条件了.(1)org.w3c.do ...

  2. MyEclipse10.0 配置 Tomcat1.7

    1 首先 从网上下载Tomcat1.7,然后放到本机目录. 2 然后在MyEclipse10.0菜单Preferences 指向Tomcat的路径,我本机路径是 D:\Program Files (x ...

  3. leetcode 21 Merge Two Sorted Lists 合并两个有序链表

    描述: 合并两个有序链表. 解决: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1) return l2; if (!l2) ...

  4. ubuntu下的文件夹命名

    本文主要学习引用了http://dbua.iteye.com/blog/943945的方法.分享快乐,嘿嘿. 由于本人菜鸟一枚,所以ubuntu选的中文,但是安装后会发现文件夹名称,什么桌面啦,下载啦 ...

  5. ubuntu 基础环境

    一.序言 这里记录了安装ubuntu 系统,以及里面常用的东西,jdk,idea,maven,svn,git 等等工具的安装,因为这些动作不是经常操作的,因此这里做一个记录,方便新手或者忘记的时候看看 ...

  6. rsync同步常用命令[转载]

    转载:http://blog.csdn.net/niushuai666/article/details/16880061 如果你是一位运维工程师,你很可能会面对几十台.几百台甚至上千台服务器,除了批量 ...

  7. Python服务器开发 -- 网络基础-乾颐堂

    网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议.包括:传输层的 FTP,UDP,TCP协议等,网络层的ip ...

  8. redhat6.7在线安装postgresql9

    原文:http://wandejun1012.iteye.com/blog/2015777 1.安装postgresql9.0 yum 仓库 rpm -i http://yum.postgresql. ...

  9. CString->char*.,char*->CString,char*->LPCTSTR

    CString->char* CString strSource;//宣告CString char* charSource; //宣告char* 法1: charSource = (char*) ...

  10. Thread.sleep() 和 Thread.yield() 区别

    1. Thread.yield(): api中解释: 暂停当前正在执行的线程对象,并执行其他线程. 注意:这里的其他也包含当前线程,所以会出现以下结果. public class Test exten ...