一、查询函数

  • 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。

函数表

函数名 功能 返回值 说明
get 返回表中满足条件的一条且只能有一条数据。 返回值是一个模型类对象。 参数中写查询条件。
1)如果查到多条数据,则抛异常MultipleObjectsReturned。
2)查询不到数据,则抛异常:DoesNotExist。
all 返回模型类对应表格中的所有数据。 返回值是QuerySet类型 查询集
filter 返回满足条件的数据。 返回值是QuerySet类型 参数写查询条件。
exclude 返回不满足条件的数据。 返回值是QuerySet类型 参数写查询条件。
order_by 对查询结果进行排序。 返回值是QuerySet类型 参数中写根据哪些字段进行排序。

函数查寻实例

首先进入环境,方便测试

py manage.py shell

然后,查寻前先要导入对应的models.py

from app1.models import BookInfo

get示例:

例:查询图书id为3的图书信息。

all方法示例:

例:查询图书所有信息。

filter方法示例:

条件格式(注意是双下划线):
模型类属性名__条件名=值

查询图书评论量为34的图书的信息:

a)判等 条件名:exact。

  • 例:查询编号为1的图书。
BookInfo.objects.get(id=1)

b)模糊查询contains

  • 例:查询书名包含'传'的图书。
BookInfo.objects.filter(btitle__contains='传')
BookInfo.objects.get(btitle__contains='传')
  • 例:查询书名以'部'结尾的图书 endswith 开头:startswith
BookInfo.objects.filter(btitle__endswith='部')

c)空查询 isnull

  • 例:查询书名不为空的图书。isnull
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)

d)范围查询 in

  • 例:查询id为1或3或5的图书。
select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])

e)比较查询 gt(greate than) lt(less than) gte(equal) 大于等于lte 小于等于

  • 例:查询id大于3的图书。
Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)

f)日期查询

例:查询1980年发表的图书。

BookInfo.objects.filter(bpub_date__year=1980)

BookInfo.objects.filter(bpub_date__mouth=5)

例:查询1980年1月1日后发表的图书。

from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法(不满足条件)示例:

例:查询id不为3的图书信息。

BookInfo.objects.exclude(id=3)
order_by方法(排序查询)示例:
  • 作用:进行查询结果进行排序。
  • 例:查询所有图书的信息,按照id从小到大进行排序。
BookInfo.objects.all().order_by('id')
  • 例:查询所有图书的信息,按照id从大到小进行排序。
BookInfo.objects.all().order_by('-id')

例:把id大于3的图书信息按阅读量从大到小排序显示。

BookInfo.objects.filter(id__gt=3).order_by('-bread')

二、对象(F、Q对象)

1)F对象(比较查询)

  • 作用:用于类属性之间的比较。
  • 使用之前需要先导入:
from django.db.models import F

例:查询图书阅读量大于评论量图书信息。

BookInfo.objects.filter(bread__gt=F('bcomment'))

例:查询图书阅读量大于2倍评论量图书信息。

BookInfo.objects.filter(bread__gt=F('bcomment')*2)

2)Q对象(not and or查询)

  • 作用:用于查询时条件之间的逻辑关系。【not and or】,可以对Q对象进行【& | ~】操作。
  • 使用之前需要先导入:
from django.db.models import Q

例:查询id大于3且(且)阅读量大于30的图书的信息。

BookInfo.objects.filter(id__gt=3, bread__gt=30)
BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))

例:查询id大于3或者(或)阅读量大于30的图书的信息。

BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))

例:查询id不等于(非)3图书的信息。

BookInfo.objects.filter(~Q(id=3))

三、聚合函数

【参考】https://docs.djangoproject.com/zh-hans/3.0/topics/db/aggregation/

  • 作用:对查询结果进行聚合操作。
  • sum count(统计) avg(求平均) max min

1) aggregate:调用这个函数来使用聚合。 返回值是一个字典

【1】使用前需先导入聚合类:

from django.db.models import Sum,Count,Max,Min,Avg

例:查询所有图书的数目。

BookInfo.objects.all().aggregate(Count('id')) #.all()可省略
{'id__count': 5}

例:查询所有图书阅读量的总和。

BookInfo.objects.aggregate(Sum('bread'))
{'bread__sum': 126}

2) count函数 返回值是一个数字

  • 作用:统计满足条件数据的数目。

例:统计所有图书的数目。

BookInfo.objects.all().count()
BookInfo.objects.count()

例:统计id大于3的所有图书的数目。

BookInfo.objects.filter(id__gt=3).count()

小结:

查询相关函数

  • get,返回一条且只能有一条数据,返回值是- -个对象,参数可以写查询条件。
  • all:返回模型类对应表的所有数据,返回值是QuerySet。
  • filter:返回满足条件的数据,返回值是QuerySet, 参数可以写查询条件。
  • exclude:返回不满足条件的数据,返回值是QuerySet,参数可以写查询条件。
  • order_ by:对查询结果进行排序,返回值是QuerySet, 参数中写排序的字段。

注意:

  1. get, filter,exclude函数中可以写查询条件,如果传多个参数,条件之间代表且的关系。
  2. all, filter, exclude, order_ by函数的返回值是QuerySet类的实例对象,叫做查询集。

from diango.db.models import F,Q,Sum,Count,.Avg.Max.Min

  1. F对象:用于类属性之间的比较。
  2. Q对象:用于条件之间的逻辑关系。

    aggregate:进行聚合操作,返回值是一个字典,进行聚合的时候需要先导入聚合类。

    count:返回结果集中数据的数目,返回值是-个数字。
  • 注意:对一个QuerySet实例对象,可以继续调用上面的所有函数。

四、查询集

all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。

4.1查询集特性

1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。

2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。

4.2 限制查询集

  • 可以对一个查询集进行取下标或者切片操作来限制查询集的结果。
  • 对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。

取出查询集第一条数据的两种方式:

方式 说明
b[0] 如果b[0]不存在,会抛出IndexError异常
b[0:1].get() 如果b[0:1].get()不存在,会抛出DoesNotExist异常。

注:exists: 判断一个查询集中是否有数据。True False

五、模型类关系(模型关联 API )

【参考】https://docs.djangoproject.com/zh-hans/3.0/topics/db/examples/

1)一对多关系

例:图书类-英雄类

models.ForeignKey() 定义在多的类中。

【关系属性】

from django.db import models

# 一类
# booktest2_bookinfo
class BookInfo(models.Model):
'''图书模型类'''
# 图书名称
btitle = models.CharField(max_length=20, db_column='title')
# 图书名字唯一
# btitle = models.CharField(max_length=20, unique=True, db_index=True)
# 价格,最大位数为10,小数为2
# bprice = models.DecimalField(max_digits=10, decimal_places=2)
# 出版日期
bpub_date = models.DateField()
# bpub_date = models.DateField(auto_now_add=True) # 创建时间
# bpub_date = models.DateField(auto_now=True) # 更新时间
# 阅读量
bread = models.IntegerField(default=0)
# 评论量
bcomment = models.IntegerField(default=0)
# 删除标记
isDelete = models.BooleanField(default=False) # 多类
class HeroInfo(models.Model):
'''英雄人物模型类'''
# 英雄名
hname = models.CharField(max_length=20)
# 性别
hgender = models.BooleanField(default=False)
# 备注
hcomment = models.CharField(max_length=200, null=True, blank=False)
# 【关系属性】
hbook = models.ForeignKey('BookInfo')
# 删除标记
isDelete = models.BooleanField(default=False)

2)多对多关系

例:新闻类-新闻类型类:(体育新闻 国际新闻)

models.ManyToManyField() 定义在哪个类中都可以。

app1/models.py【关系属性】

from django.db import models

# 新闻类型类
class NewsType(models.Model):
# 类型名
type_name = models.CharField(max_length=20)
# 关系属性,代表类型下面的信息
type_news = models.ManyToManyField('NewsInfo') # 新闻类
class NewsInfo(models.Model):
# 新闻标题
title = models.CharField(max_length=128)
# 发布时间
pub_date = models.DateTimeField(auto_now_add=True)
# 信息内容
content = models.TextField()
# 【关系属性】, 代表信息所属的类型
# news_type = models.ManyToManyField('NewsType')

3)一对一关系

例:员工基本信息类-员工详细信息类. 员工工号

models.OneToOneField 定义在哪个类中都可以。

app1/models.py【关系属性】

from django.db import models

# 员工基本信息类
class EmployeeBasicInfo(models.Model):
# 姓名
name = models.CharField(max_length=20)
# 性别
gender = models.BooleanField(default=False)
# 年龄
age = models.IntegerField()
# 关系属性,代表员工的详细信息
employee_detail = models.OneToOneField('EmployeeDetailInfo') # 员工详细信息类
class EmployeeDetailInfo(models.Model):
# 联系地址
addr = models.CharField(max_length=256)
# 教育经历
# 【关系属性】,代表员工基本信息
# employee_basic = models.OneToOneField('EmployeeBasicInfo')

六、关联查询(一对多)

6.1查询和对象关联的数据

  • 在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做【关联属性】。

例1:查询id为1的图书关联的英雄的信息。

from app1.moldels import BookInfo,HeroInfo
b=BookInfo.objects.get(id=1)
b.heroinfo_set.all()

例1通过模型类查询:

HeroInfo.objects.filter(hbook__id=1)

例2:查询id为1的英雄关联的图书信息。

from app1.moldels import BookInfo,HeroInfo
h = HeroInfo.objects.get(id=1)
h.hbook

例2通过模型类查询:

BookInfo.objects.filter(heroinfo__id=1)

格式:

6.2.1 由一类的对象查询多类的时候:

一类的对象.多类名小写_set.all() #查询所用数据

6.2.2 由多类的对象查询一类的时候:

多类的对象.关联属性  #查询多类的对象对应的一类的对象

6.2.3由多类的对象查询一类对象的id时候:

多类的对象. 关联属性_id

6.3 通过模型类实现关联查询

参考:https://docs.djangoproject.com/zh-hans/3.0/topics/db/examples/

6.3.1关联查询

注意:

  1. 通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。
  2. 写关联查询条件的时候,如果类中没有关系属性,条件需要些对应类的名,如果类中有关系属性,直接写关系属性。
  • 例1:查询图书信息,要求图书关联的英雄的描述包含'八'。

    BookInfo.objects.filter(heroinfo__hcomment__contains='八')

  • 例2:查询图书信息,要求图书中的英雄的id大于3.

    BookInfo.objects.filter(heroinfo__id__gt=3)

  • 例3:查询书名为“天龙八部”的所有英雄。

    HeroInfo.objects.filter(hbook__btitle='天龙八部')

6.3.2通过多类的条件查询一类的数据:

一类名.objects.filter(多类名小写__多类属性名__条件名)

6.3.3通过一类的条件查询多类的数据:

多类名.objects.filter(关联属性__一类属性名__条件名)

Django(九)模型:dj查询数据库的函数(方法)的更多相关文章

  1. Django 1.8.11 查询数据库返回JSON格式数据

    Django 1.8.11 查询数据库返回JSON格式数据 和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式 环境 Win10 Python2.7 Django 1.8.11 返回多 ...

  2. Django:模型model和数据库mysql(一)

    以一个栗子尝试来记录: 两个表存储在数据库中,BookInfo表示书,HeroInfo表示人物.一本书中有多个人物 在MySQL中新建一个数据库Django1,不用创建表,用Django模型来配置数据 ...

  3. Java_jdbc 基础笔记之九 数据库连接 (查询Customer对象的方法)

    /** * * 写一个查询Customer对象的方法 * */ public Customer getCustomer(String sql, Object... args) { Customer c ...

  4. Django:模型model和数据库mysql(二)

    上一篇把简单的模型与数据库的搭建写了一遍,但模型中有很多深入好用的写法补充一下. 同样的栗子,建立新的模型与数据库来写一写 1.依然是搭建环境 >>>django-admin sta ...

  5. Django中views数据查询使用locals()函数进行优化

    优化场景 利用视图函数(views)查询数据之后可以通过上下文context.字典.列表等方式将数据传递给HTML模板,由template引擎接收数据并完成解析.但是通过context传递数据可能就存 ...

  6. Oracle查询序列和函数方法封装

    工具方法: @Autowired private JdbcTemplate businessTpmeJdbcTemplate; @SuppressWarnings("deprecation& ...

  7. Django中模型(三)

    Django中模型(三) 四.模型成员 1.类属性 objects:是Manager类的一个对象,作用是与数据库进行交互. 定义模型类时,没有定义管理器,则默认创建名为objects的管理器. 2.自 ...

  8. 64、django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  9. django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

随机推荐

  1. 最长公共子序列/子串 LCS(模板)

    首先区分子序列和子串,序列不要求连续性(连续和不连续都可以),但子串一定是连续的 1.最长公共子序列 1.最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题 2.同时,子问题的解释可以被重 ...

  2. CF 1073 E. Segment Sum

    https://codeforces.com/problemset/problem/1073/E 题意:[l,r]中,出现0—9数字的种类数不超过k的数的和 dp[i][j][0/1] 表示 dfs到 ...

  3. 第4节 Scala中的actor介绍:1、actor概念介绍;2、actor执行顺序和发送消息的方式

    10.    Scala Actor并发编程 10.1.   课程目标 10.1.1.    目标一:熟悉Scala Actor并发编程 10.1.2.    目标二:为学习Akka做准备 注:Sca ...

  4. android开发如何在页面之间传参

    第一个页面跳转 传递值 Button bn1=(Button)findViewById(R.id.btn_Login); //跳转bn1.setOnClickListener(new OnClickL ...

  5. [HEOI 2013]SAO

    Description 题库连接 给你一个 \(n\) 个节点的有向树,问你这棵树的拓扑序个数,对大质数取模.多测,测试组数 \(T\). \(1\leq n\leq 1000, 1\leq T\le ...

  6. Linux centos VMware Nginx防盗链、Nginx访问控制、Nginx解析php相关配置、Nginx代理

    一.Nginx防盗链 配置如下,可以和上面的配置结合起来 location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|x ...

  7. Python 基础之模块之math random time

    一:math 数学模块import math#(1)ceil() 向上取整操作 (对比内置round)res = math.ceil(6.001)  #注意精度损耗print(res)#(2)floo ...

  8. EMR 配置纪录(不断更新)

    日志路径 -> /var/log(软连接到 /mnt/var/log) 在 spark master 机器中,配置的路径为 /usr/lib/spark/conf /usr/lib/hadoop ...

  9. UIWindow的获取

    注意:还是直接用下面这个比较靠谱.尤其是iOS11之后. [UIApplication sharedApplication].keyWindow;   1.下面这种是比较严谨的方式 - (UIWind ...

  10. 应用间的API访问如何认证?

    任何一个一个应用要访问另一个应用的API,需要首先到开放平台获取访问accesskey, 然后访问目标应用,目标应用中先检查来源访问token是否已存在缓存中,不存在需要去开放平台校验accesske ...