ORM的查询操作
查询的分类
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的查询操作的更多相关文章
- Django的ORM常用查询操作总结(Django编程-3)
Django的ORM常用查询操作总结(Django编程-3) 示例:一个Student model: class Student(models.Model): name=models.CharFiel ...
- Django视图之ORM数据库查询操作API
查询表记录 查询相关API 操作:models.表名.objects.方法() all(): 查询所有结果 filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 get(**kwar ...
- ORM数据库查询操作之基于双下划线的跨表查询
创建表结构 from django.db import models class Book(models.Model): title=models.CharField(max_length=32) ...
- Django--数据库查询操作
MySQL是几乎每一个项目都会使用的一个关系数据库,又因为它是开源免费的,所以很多企业都用它来作为自家后台的数据库. BAT这类大公司除外,它们的业务数据是以亿级别来讨论的,而MySQL的单表6000 ...
- Django框架 之 ORM查询操作详解
Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...
- Django ORM (三) 查询,删除,更新操作
ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...
- Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作
Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...
- day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...
- 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)
一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段 示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...
随机推荐
- 【316】python.requests 读取网页信息
参考:Python:在网页中查找字符串的一般方法--in 参考:python怎么安装requests 参考:Requests 快速上手 操作步骤如下: 添加环境变量,将 python 所在文件夹添加至 ...
- python's output redirect
[python's output redirect] fin = open("xx.txt", 'r'); print >>fin, "hello world ...
- PLSQL result set exceeds the maximum size(100M)if necessary,you can explicitly confinue this query
在PL SQL 里执行一条语句,当反正信息达到2w条时,弹出如下内容:result set exceeds the maximum size(100M)if necessary,you can exp ...
- jquery去掉click事件
1:使用removeAttr( )和attr( ) $("a").attr("click",test()); $("a").removeAt ...
- Python slice() 函数
Python slice() 函数 Python 内置函数 描述 slice() 函数实现切片对象,主要用在切片操作函数里的参数传递. 语法 slice 语法: class slice(stop) ...
- 关于网页头图标ico的问题
今天同事问了我一个比较奇怪的问题,对于我来说,可能和编码没什么关系,但是确实是头一次注意到,所以把问题记录了下来,方便以后积累经验. 问题就是: 在本地的网页中设置了头图标 <link rel= ...
- 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个出来,可以基于最后一个元 ...
- code1105 过河
dp方程很简单: f[i] = min{ f[i-j] } + stone[i] 但是数据10^9太大了,超时超空间,这样只能过30% 来自:http://blog.csdn.net/w1996070 ...
- 界面设计中如何增强CTA按钮召唤力?
以下内容由Mockplus(摹客)团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 网页和软件应用之类数字产品的有效交互系统一般是由拥有各种任务和功能的小元素构成.而为创建更加 ...
- Eclipse下初用lucene
lucene是apache的一个开源项目,一个开放源代码的全文检索引擎工具包. 1. 首先下载lucene,下载地址来自<lucene实战>第2版(页面加载比较忙,等~) http://w ...