查询相关API

from django.db import models

# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2) #创建一对多的关联字段
publish = models.ForeignKey("Publish") #创建多对多的关系
authors = models.ManyToManyField("Author") def __str__(self):return self.title class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
email = models.EmailField() class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() class AuthorDetail(models.Model):
addr = models.CharField(max_length=32)
email = models.EmailField()
author = models.OneToOneField("Author")

数据准备

  一定区分object和QuerySet的区别

   #all() 查询所有结果
book_list=Book.objects.all() #<QuerySet [<Book: book1>, <Book: book2>, <Book: book3>]> #filter()它包含了与所给筛选条件相匹配的对象
book_list = Book.objects.filter(id=1)  #<QuerySet [<Book: book1>]> #get() model对象 有且只有一个查询结果时才有意义 如果超过一个或者没有都会抛出异常
book = Book.objects.get(id=2) #<Book: book2> #order_by() model对象 对查询结果排序
book = Book.objects.all().order_by("-id") #<QuerySet [<Book: book3>, <Book: book2>, <Book: book1>]> #reverse() 对查询结果反向排序
book = Book.objects.all().order_by("-id").reverse() #count() 返回匹配查询对象的数量
book = Book.objects.all().order_by("-id").count() # #exists() 如果Queryset包含数据,则返回true,否则返回false
book = Book.objects.all().exists()         #True book = Book.objects.filter(id=20).exists() #False #values() 返回一个valueQureyset 是一个可迭代的字典序列
book = Book.objects.all().values("title") #<QuerySet [{'title': 'book1'}, {'title': 'book2'}, {'title': 'book3'} ]> #values_list() 返回的是一个元组序列,values返回的是一个字典序列
book = Book.objects.all().values_list("title")#<QuerySet [('book1',), ('book2',), ('book3',)]> #distinct() 从返回结果中剔除重复记录
book = Book.objects.all().distinct() #first() 返回第一条记录
book = Book.objects.all().first() #<Book: book1> #last() 返回最后一条记录
book = Book.objects.all().last()  #<Book: book6> #exclude() 它包含了与所给筛选条件不匹配的对象
book = Book.objects.all().exclude(id=2) #<QuerySet [<Book: book1>, <Book: book3>, <Book: book4>]>

双下划线之单表查询

   #id 大于3且小于6的值
book = Book.objects.filter(id__lt=6,id__gt=3) #<QuerySet [<Book: book4>, <Book: book5>]> #获取id等于1、2、3的数据
book = Book.objects.filter(id__in=[1,2,3]) #<QuerySet [<Book: book1>, <Book: book2>, <Book: book3>]> # not in
book = Book.objects.filter().exclude(id__in=[1,2,3]) #<QuerySet [<Book: book4>, <Book: book5>, <Book: book6>]> #icontains大小写不敏感
book = Book.objects.filter(title__contains="book")
book = Book.objects.filter(title__icontains="book") # 范围bettwen and
book = Book.objects.filter(id__range=[1,4]) #startswith,istartswith, endswith, isendswith 

基于对象的跨表查询

  一对多查询:正向查询按字段,反向查询按‘表名小写_set’

    # 查询id=2的书籍的出版社的名称
book_obj = Book.objects.filter(id=2).first()
print(book_obj.publish.name) # 查询“邮电出版社”出版过的书籍名称
publish_obj = Publish.objects.filter(name='邮电出版社').first()
print(publish_obj.book_set.all())

  多对多查询:正向查询按字段,反向查询按‘表名小写_set’

    # 查询book1所有作者的名字
book_obj = Book.objects.filter(title="book1").first()
print(book_obj.authors.values("name")) # 查询alex出版过的所有书籍名称
author_obj = Author.objects.filter(name='alex').first()
print(author_obj.book_set.all().values('title'))

  一对一查询:正向查询按字段,反向查询按‘表名小写’

   # 查询emai为123@qq.com的作者的名字
authordetail_obj = AuthorDetail.objects.filter(email="123@qq.com").first()
print(authordetail_obj.author.name) # 查询alex的email
author_obj = Author.objects.filter(name='alex').first()
print(author_obj.authordetail.email)

基于双下划线的跨表查询

  Django提供了 一种直观而高效的方式在查询中表示关联关系,它能自动确认SQL JOIN联系。要做跨关系查询,就使用两个下划线来链接模型间关联字段的名称,直到最终链接到你想要的model为止

  正向查询按字段,反向查询按表名

  一对多

  book_obj = Book.objects.filter(price=100).values("title","publish__name")

    temp = []
for book in Book.objects.filter(price=100): temp.append({
"title":book.title,
"publish__name":book.publish.name,
}) # 查询人民出版社出版过的书籍名称
publish_obj = Publish.objects.filter(name='人民出版社').values("book__title") temp= []
for book in publish_obj.book_set.all():
temp.append({
"book_title":book.title
})

  多对多

    # 查询book1所有作者的名字
book_obj = Book.objects.filter(title='book1').values("authors__name") # 查询alex出版过的所有书籍名称
author_obj = Author.objects.filter(name='alex').values("book__title")

  一对一

    # 查询手email以1开头的作者出版过的所有书籍名称以及出版社名称
authordetail_obj = AuthorDetail.objects.filter(email__startswith="").values("author__book__title","author__book__publish__name") # 查询alex的email
author_obj = Author.objects.filter(name='alex').values("authordetail__email")

聚合查询与分组查询

聚合查询

from django.db.models import Avg
Book.objects.all().aggregate(Avg('price')) #{'price__avg': 107.14285714285714}

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

Book.objects.aggregate(average_price=Avg('price')) #{'average_price': 107.14285714285714}

  如果你希望生成不止一个聚合,你可以向aggregate()子句中添加另一个参数

from django.db.models import Avg,Max,Min
Book.objects.aggregate(Avg('price'),Max('price'),Min('price'))#{'price__avg': 107.14285714285714, 'price__max': Decimal('200.00'), 'price__min': Decimal('30.00')}

分组查询

  为调用的QuerySet的每一个对象都生成一个独立的统计值

   # 查询每一个出版社的名称以及出版过的书籍个数
queryset_result = Publish.objects.all().annotate(c=Count("book")).values("name","c")
print(queryset_result) # 查询每一个作者的名字以及出版过的所有书籍的最高价格
queryset_result = Author.objects.all().annotate(max_Price=Max("book__price")).values("name","max_Price")
print(queryset_result) # 查询每一本书的名字,对应出版社名称以及作者的个数
queryset_result = Book.objects.all().annotate(c=Count("authors")).values("title","publish__name","c")
print(queryset_result) #根据一本图书作者数量的多少对查询集 QuerySet进行排序:
Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')

F查询与Q查询

F查询

  如果我们要对两个字段的值做比较的话可以使用F查询,F()的实例可以在查询中引用字段,来比较同一个model实例中两个不同字段的值

   # 查询评论数大于收藏数的书籍
from django.db.models import F
Book.objects.filter(commnetNum__lt=F('keepNum'))

  Django支持F()对象以及F()对象和常数之间的加减乘除和取模的操作

    # 查询评论数大于收藏数2倍的书籍
Book.objects.filter(commnetNum__lt=F('keepNum')*2)

  修改操作也可以使用F函数

#将每一本书的价格提高30元
Book.objects.all().update(price=F("price")+30) 

Q查询

  filter()等方法中的关键字参数查询都是一起进行“AND”的,如果你需要执行更复杂的查询(例如or语句),你可以使用Q对象

  Q对象可以使用&和|操作符组合起来,当一个操作符在两个Q对象上使用时,它产生一个新的Q对象

bookList=Book.objects.filter(Q(authors__name="a1")|Q(authors__name="a2"))

  Q对象可以使用~操作符取反

bookList=Book.objects.filter(Q(authors__name="a1") & ~Q(publishDate__year=2017)).values_list("title")

  查询函数可以混合使用Q对象和关键字参数,所有提供给查询函数的参数(关键字参数或对象)都将“AND”在一起,但是如果出现Q对象,它必须位于所有关键字参数的前面

 bookList=Book.objects.filter(Q(publishDate__year=2016)|Q(publishDate__year=2017),title__icontains="python" )

Django中ORM之查询表记录的更多相关文章

  1. Django中ORM之操作表记录

    添加表记录 添加普通字段 #方法一 book_obj = Book(title='book7',publishDate='2011-05-02',price=200,publish_id=1) boo ...

  2. Django中ORM介绍和字段及其参数

    ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述 ...

  3. Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  4. 6月20日 Django中ORM介绍和字段、字段参数、相关操作

    一.Django中ORM介绍和字段及字段参数 二.Django ORM 常用字段和参数 三.Django ORM执行原生SQL.在Python脚本中调用Django环境.Django终端打印SQL语句 ...

  5. Django中ORM实际应用

    1. Django中ORM的使用 1. 手动新建一个数据库 2. 告诉Django连接哪个数据库 settings.py里面配置数据库连接信息: # 数据库相关的配置项 DATABASES = { ' ...

  6. Django 中ORM 的使用

    一:Django 中 orm 的使用 1:手动新建一个数据库 2 :告诉Django连接哪个数据库 settings.py里配置数据库连接信息: #数据库相关的配置项 DATABASES ={ 'de ...

  7. Django中ORM的聚合索引

    Django中ORM的聚合索引   在Django中,聚合函数是通过aggregate方法实现的,aggregate方法返回的结果是一个字典 在使用时需要先导入模块from django.db.mod ...

  8. 关于Django中ORM数据库迁移的配置

    Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django. ...

  9. Django中ORM的使用

    Django中ORM的使用 ORM orm(object-relation-mapping)对象关系映射,即用对象来表示关系数据库中的表: 类 --> 表, 对象-->一行数据 对象的属性 ...

随机推荐

  1. 动态规划——独立任务最优调度(Independent Task Scheduling)

    题目链接 题目描述 用2 台处理机A 和B 处理n 个作业.设第i 个作业交给机器A 处理时需要时间i a ,若由机器B 来处理,则需要时间i b .由于各作业的特点和机器的性能关系,很可能对于某些i ...

  2. 沃通SSL证书、代码签名证书应用于机器人安全防护

    近两年,扫地机器人.智能音箱等消费级机器人产品逐渐走入大众生活的中.随着人工智能技术的迅猛发展,预计2023年全球消费级机器人市场规模将达到150亿美元.然而,产业的迅猛发展却伴随着安全防护的缺失,安 ...

  3. Python数据分析2------数据探索

    一.数据探索 数据探索的目的:及早发现数据的一些简单规律或特征 数据清洗的目的:留下可靠数据,避免脏数据的干扰. 两者没有严格的先后顺序,经常在一个阶段进行. 分为: (1)数据质量分析(跟数据清洗密 ...

  4. ajax异步上传文件和表单同步上传文件 的区别

    1. 用表单上传文件(以照片为例)-同步上传 html部分代码:这里请求地址index.php <!DOCTYPE html> <html lang="en"&g ...

  5. 训练1-E

    有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程. 例如: x + y = 9,x * y ...

  6. linux github 添加ssh

    1.本地生成key,  xxx 是github 的账号, 执行下面命令一路下一步 ssh-keygen -t rsa -C "xxx" 2.复制下面的public key 到git ...

  7. Python3爬虫环境配置

    一.包管理工具Anaconda安装 1.安装直接在官网下载最新版本的 https://www.continuum.io/downloads 2.配置环境变量PATH:C:\Users\Administ ...

  8. BIO、NIO、AIO

    一.基础概念 IO操作分为两步:1.发起IO请求:2.执行具体IO操作: 同步和异步的区别是数据访问时进程是否阻塞或者说在执行真正IO操作时,数据能够立即返回就是异步,否则就是同步,同步和异步发生在I ...

  9. 机房工程-在线式、后备式UPS选择(转载)

    原文网址:http://oa.yesky.com/10/31061510all.shtml#p31061510 1后备式UPS还是在线式UPS? 作为机房设备的一项重要保护措施,UPS起着无可替代的作 ...

  10. 洛谷—— P1126 机器人搬重物

    https://www.luogu.org/problem/show?pid=1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机 ...