Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)
文章目录
- 1.查询函数
- 2.F对象
- 3.Q对象
- 4.聚合函数
- 5.Count函数
- 6.查询集
- 查询集的特性
- 对查询集进行切片
- 判断一个查询集中是否有数据
- 7.模型类之间的关系
- 一对多关系
- 多对多关系
- 一对一关系
- 8.关联查询(一对多)
- 9.插入、更新和删除
- 10.自关联
- 11.管理器
- 自定义管理器类
- 12.元选项
1.查询函数
模型类.objects.函数名()
函数:
get
:返回满足条件的一条数据,只能返回一条数据。参数为条件。
all
:返回满足条件的查询集,QuerySet类型
filter
:返回满足条件的数据。QuerySet类型,参数为条件。可以传入多个参数。
exclude
:返回不满足条件的数据。QuerySet类型,参数为条件。
order_by
:对查询结果进行排序。QuerySet类型
条件参数格式
判等条件:id__exact==1
(等价于id=1)
模糊查询:
包含btitle__contains='乐'
,开头btitle__startswith='value'
,结尾btitle__endswith='value'
空查询:btitle__isnull=False
查询范围:id__in[1,3,5]
比较查询:
id__gt=3
(great than)大于 , id__gte=3
大于等于
id__lt=3
(less than)小于 ,id__lte=3
小于等于
日期查询:
方法一 publish_date__year=1980
方法二 publish_date__gt=date(1980,1,1)
排序:
从小到大
BookInfo.objects.all().order_by('id')
从大到小
BookInfo.objects.all().order_by('-id')
2.F对象
作用:用于类属性之间的比较
from django.db.models import F
例如:查询阅读量大于评论量
BookInfo.objects.filter(read__gt=F('comment'))
3.Q对象
作用:用于查询时条件之间的逻辑关系,not and or,可以对Q对象进行& | ~操作
from django.db.models import Q
例如:id>3且阅读量大于30
BookInfo.obkects.filter(id__gt=3,read__gt=30)
BookInfo.obkects.filter(Q(id__gt=3)&Q(read__gt=30))
例如:查询id大于3或者阅读量大于30的图书信息
BookInfo.obkects.filter(Q(id__gt=3)|Q(read__gt=30))
例如:查询id不等于3的图书信息
BookInfo.obkects.filter(~Q(id__gt=3))
4.聚合函数
对查询结果进行聚合操作:sum count avg max min
在Django中调用aggregate
函数来使用聚合,返回值是一个字典。
from django.db.models import Sum,Count,Max,Min,Avg
例如:查询所有图书的数目
>>> BookInfo.objects.all().aggregate(Count("id"))
{'id__count': 9}
例如:所有图书的阅读量总和
>>> BookInfo.objects.all().aggregate(Sum("read"))
{'read__sum': 9245}
5.Count函数
作用:统计满足条件数据的数目,返回值是一个数字。
例如:统计所有图书的数目
>>> BookInfo.objects.all().count()
9
6.查询集
all filter exclude order_by
调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。
查询集的特性
惰性查询:只有在实际使用查询集中的数据的时候才会发生数据库真正查询。
缓存:当时用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存,之后再使用这个查询集时,使用的是缓存中的数据。
对查询集进行切片
下标不允许为负数
>>> books=BookInfo.objects.all()
>>> books[2:5]
[<BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>]
判断一个查询集中是否有数据
使用 exists
判断,没有返回False
,有返回True
>>> books=BookInfo.objects.all()
>>> books1 = books[0:0]
>>> books1.exists()
False
7.模型类之间的关系
一对多关系
models.ForeignKey()
定义在多类中
多对多关系
models.ManyToManyField()
定义在双方都可以
class NewsType(models.Model):type_name = models.CharField(max_length=20)class NewsInfo(models.Model):title = models.CharField(max_length=120)pub_date = models.DateTimeField(auto_now_add=True)content = models.TextField()news_type = models.MangToManyField('NewsType')
一对一关系
models.OneToOneField()
定义在双方都可以
8.关联查询(一对多)
例:查询图书id为1的所有英雄的信息
books=BookInfo.objects.get(id=1)
books.heroInfo_set.all()
通过模型类查询:
HeroInfo.obkects.filter(hbook__id=1)
例:查询id为1的英雄关联的图书信息
h = HeroInfo.objects.get(id=1)
h.hbook
通过模型类查询:
BookInfo.objects.filter(heroinfo__id=1)//多类类名小写
9.插入、更新和删除
10.自关联
自关联是一种特殊的一对多关系
例如:地区表的父级关系,陕西省-西安市,西安市的areaParent_id为陕西省的ID
class AreaInfo(models.Model):areaName = models.CharField(max_length=100)areaParent = models.ForeignKey('self',null=True,blank=True)
11.管理器
BookInfo.objects.all()
中objects
是一个Django自动生成的管理器对象,通过这个对象可以实现对数据的查询。objects
是models.Manager
类的一个对象。
>>> type(BookInfo.objects)
<class 'django.db.models.manager.Manager'>
自定义管理器类
自定义BookInfoManager类,这个类继承自models.Manager,并且重写all()方法。
class BookInfoManager(models.Manager):#user defined class of managing the bookinfo#override function all()def all(self):#call all() of super classbooks = super().all()for item in books:print("bookTile:"+item.bookTitle)return books
class BookInfo(models.Model):bookTitle = models.CharField(max_length=20)publish_date = models.DateField()read = models.IntegerField(default=0)comment = models.IntegerField(default=0)#Delete tagisDelete = models.BooleanField(default=False)objects = BookInfoManager()
自定义管理器方法:
class BookInfoManager(models.Manager):#user defined class of managing the bookinfo#override function all()def all(self):#call all() of super classbooks = super().all()for item in books:print("bookTile:"+item.bookTitle)return booksdef createBook(self,bookTitle,publish_date):model_class = self.modelobj =model_class()obj.bookTitle = bookTitleobj.publish_date = publish_dateobj.save()return obj
>>> from booktest002.models import BookInfo
>>> BookInfo.objects.createBook("xcjs","1999-1-1")
<BookInfo: BookInfo object>
>>> BookInfo.objects.all()
bookTile:lldq
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:jpm
bookTile:xcjs
[<BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>]
可以通过self.model()
获取所在模型类,这样即使模型类名发生变化,也能正常使用。
>>> BookInfo.objects.model
<class 'booktest002.models.BookInfo'>
12.元选项
模型类对应的表已经生成,此时,模型类或应用一旦改名,与数据库表名不对应就会出现问题。Django默认生成的表名:应用名小写_模型类名小写
如何解决?
使用元选项:需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。
class BookInfo(models.Model):bookTitle = models.CharField(max_length=20)publish_date = models.DateField()read = models.IntegerField(default=0)comment = models.IntegerField(default=0)#Delete tagisDelete = models.BooleanField(default=False)objects = BookInfoManager()class Meta:db_table = "bookinfo"
指定之后,重新迁移,数据库表名就不依赖其模型类了。
Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)相关推荐
- django 学习笔记
django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...
- django学习笔记03
原创博客地址:django学习笔记03 第一章,模型层 查询集API 一.QuerySet何时被提交 迭代 QuerySet是可迭代的,在首次迭代查询集时执行实际的数据库查询 切片:如果使用切片的&q ...
- django学习笔记02
原创博客地址:django学习笔记02 第一章:模型层 1.8 查询操作 一.创建对象 1 2 3 4 5 >>> from blog.models import Blog > ...
- django学习笔记01
原创博客地址:django学习笔记01 基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87 第一章:模型层 1.1 模 ...
- 千锋Django学习笔记
千锋Django学习笔记 文章目录 千锋Django学习笔记 写在前面 1. MVC和MTV 2. Django简介 3. MTV简单流程 4. 和Model的简单对接 5. Model 6. Tem ...
- Django学习笔记(五)
Django学习笔记(五) MVC和MTV对比 传统的MVC(Model-View-Controller) M 模型层,主要是对数据库层的封装 V 视图层,向用户展示结果 C 控制层,用于请求,获取数 ...
- Django学习笔记---第一天
Django学习笔记 1.Django的安装 //如果不指定版本号,默认安装最新版 pip3 install django==1.11.8 关于Django的版本和python的版本依赖关系,请看下图 ...
- 九.django学习笔记二
django学习之模型 我们在前面已经讲过,模型是专门与数据库交互的部分,那模型是如何实现增删改查的呢,已经如何在项目中使用我们的mysql数据库呢 一.数据库的增删改查 增:book = BookI ...
- 分享:Django学习笔记(4)---ManyToMany 添加、删除关联、查询
Django学习笔记(4)---ManyToMany 添加.删除关联.查询 http://my.oschina.net/u/572994/blog/105280
- 梅科尔工作室-Django学习笔记(二次学习)(3)
本次学习的是如何用django实现前端鸿蒙OS登录 下面介绍一下本次的操作过程. 1.首先创立MySQL数据并将数据库导入到django当中 其中:导入数据库的操作: 2.配置urls 对应新建的pe ...
最新文章
- 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )
- 类加载器的双亲委派及打破双亲委派
- PostgreSQL表的行数统计
- 数据结构——二叉树的最长路径问题
- axis=0 与axis=1 的区分
- jmap+MAT实战内存溢出
- java获取C盘下的隐藏目录文件名称
- 当我们谈数据库时,是在谈什么?
- django分页-Paginator类
- 数据结构上机实践第八周项目3-顺序串算法
- 2021-11-16-小甲鱼python教学视频总结
- 软件安全实验——lab10(一、基于时间的侧信道攻击)
- Centos 7 Opencv安装使用
- xp计算机u盘重装系统,解决戴尔电脑u盘重装系统xp教程
- OCCT v11.0.16 x64 电脑硬件检测烤鸡软件中文
- 计算机更换内存条后无法连接网络,换主机后怎么连接网络
- linux 截取某一段时间的日志,存储到另一个文件中
- c语言md5函数 linux,【转】MD5校验C语言实现源代码
- 【CRH】列车通过曲线时,曲线半径、超高值与车速的关系
- 俞敏洪的一分钟励志演讲
热门文章
- 机器人系统的基本概念及外部模型参数详解
- 【DLL的函数】关于DLL的函数|_declspec(dllimport)
- 进制之间快速转换技巧
- 投影仪应该怎么选择?数码粉总结目前最好的家用投影仪
- 高频功率放大器输出为什么会有高次谐波
- maven打包缺少依赖异常eu.neilalexander:jnacl:jar:1.0.0 was not found in...解决
- 生命苍白无力时候遇到你,即使再难也要亲手绘出五彩生活――读《平庸的世界》有感...
- 苹果首款自研芯片 M1 惊艳亮相,带来最强三款 Mac 电脑!
- OEM,ODM,OBM,JDM概念
- Revit-BIM模型轻量化 帧率控制