Django(九)模型:dj查询数据库的函数(方法)
一、查询函数
- 通过模型类.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, 参数中写排序的字段。
注意:
- get, filter,exclude函数中可以写查询条件,如果传多个参数,条件之间代表且的关系。
- all, filter, exclude, order_ by函数的返回值是QuerySet类的实例对象,叫做查询集。
from diango.db.models import F,Q,Sum,Count,.Avg.Max.Min
- F对象:用于类属性之间的比较。
- 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:查询图书信息,要求图书关联的英雄的描述包含’八’。
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查询数据库的函数(方法)相关推荐
- python学习第6天---django框架---模型类及数据库操作
python学习第6天---django框架---模型类及数据库操作 目录 文章目录 1.字段与选项 2.查询函数 3.查询集 4.模型类之间的关系 4.1.对应关系 4.2.关联查询 5.模型管理器 ...
- Django:模型model和数据库mysql(一)
以一个栗子尝试来记录: 两个表存储在数据库中,BookInfo表示书,HeroInfo表示人物.一本书中有多个人物 在MySQL中新建一个数据库Django1,不用创建表,用Django模型来配置数据 ...
- Django+scrapy,scrapy爬取的数据通过Django的模型保存到数据库
首先确认已经安装好Django和scrapy 创建一个Django项目和Django应用 django-admin startproject django_scrapy_test python man ...
- Django层级模型定义及序列化嵌套的方法
----------Django==2.0.2----------- 一.Django层级模型的定义 实例:(商品模型) class GoodsCategory(models.Model):" ...
- 查询数据库重复记录方法
SQL语句查询数据库重复记录的方法 SQL语句查询数据库重复记录的方法 SQL 语句 查询 数据库 记录SQL语句查询数据库重复记录的方法 假设现有一张人员表(表名:Person),若想将姓名.身份证 ...
- 在django中按照时间范围查询数据库
2019独角兽企业重金招聘Python工程师标准>>> 介绍一个简单的功能,就是从web表单里获取用户指定的时间范围,然后在数据库中查询此时间范围内的数据. 数据库里 ...
- oracle查询数据库的函数,Oracle:树查询及有关函数
Oracle:树查询及相关函数 Oracle树查询的最重要的就是select...start with... connect by ...prior 语法了.依托于该语法,我们可以将一个表形结构的中以 ...
- Django 6 模型与数据库 (2) 各种查询操作以及多表查询
Django通过模型迁移除数据库的数据表,又提供了操作数据模型的API来实现对目标数据库的读写操作.数据库的读写操作主要对数据进行增.删. 改.查. Django带有shell模式(启动命令行和执行脚 ...
- django mysql返回json_Django 1.8.11 查询数据库返回JSON格式数据
Django 1.8.11 查询数据库返回JSON格式数据 和前端交互全部使用JSON,如何将数据库查询结果转换成JSON格式 环境 Win10 Python2.7 Django 1.8.11 返回多 ...
最新文章
- python乘法口诀编程-中年大叔学编程-用Python打印个九九乘法表
- 部落卫队pascal解题程序
- IBASE component deletion
- 微信页面弹出窗口,底部不随窗口滑动而滚动
- 设置ABP默认使用中文
- JavaEE编码规范
- 本机与服务器、镜像机之间文件互传
- C#中DataRow的初始化
- 论模式在领域驱动设计中的重要性
- Objective-C中的单例模式
- [Liferay6.2]Liferay Dynamic Query API示例
- 【转】Python基础-字符串
- 2017计算机办公自动化试题,2017年办公自动化考试试题及解答
- vep文件如何转换mp4_vep文件如何转换mp4?vep转mp4的操作演示简单又小白
- 阿里云服务器(Centos7)安装谷歌浏览器
- Linux Opencv+zBar二维码识别
- xp证书错误补丁_爱思助手 IPA 签名功能常见问题汇总,安卓软件修复南瓜影视无法播放问题,新增皮皮虾xp版,内置皮皮虾伴侣!...
- 2021中考成绩查询高考,2021年中考成绩公布时间
- vue项目中获取当前设备 操作系统及版本,设备型号,ip,地区信息
- 数据挖掘实战(6)——机器学习实现文本分类(今日头条tnews数据集)