前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Django 模型查询2.3

Django 模型查询2.3

作者头像
Lansonli
发布于 2021-10-09 02:55:41
发布于 2021-10-09 02:55:41
2.4K00
代码可运行
举报
文章被收录于专栏:Lansonli技术博客Lansonli技术博客
运行总次数:0
代码可运行

简介

  • 查询集表示从数据库中获取的对象集合
  • 查询集可以含有零个、一个或多个过滤器
  • 过滤器基于所给的参数限制查询的结果
  • 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句
  • 接下来主要讨论如下知识点
    • 查询集
    • 字段查询:比较运算符,F对象,Q对象

查询集

  • 在管理器上调用过滤器方法会返回查询集
  • 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤
  • 惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库
  • 何时对查询集求值:迭代,序列化,与if合用
  • 返回查询集的方法,称为过滤器
    • all()
    • filter()
    • exclude()
    • order_by()
    • values():一个对象构成一个字典,然后构成一个列表返回
  • 写法:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(1=1,2=2)
等价于
filter(1=1).filter(2=2)
  • 返回单个值的方法
    • get():返回单个满足条件的对象
      • 如果未找到会引发"模型类.DoesNotExist"异常
      • 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
    • count():返回当前查询的总条数
    • first():返回第一个对象
    • last():返回最后一个对象
    • exists():判断查询集中是否有数据,如果有则返回True

限制查询集

  • 查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和offset子句
  • 注意:不支持负数索引
  • 使用下标后返回一个新的查询集,不会立即执行查询
  • 如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()引发DoesNotExist异常

查询集的缓存

  • 每个查询集都包含一个缓存来最小化对数据库的访问
  • 在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存的结果
  • 情况一:这构成了两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print([e.title for e in Entry.objects.all()])
print([e.title for e in Entry.objects.all()])
  • 情况二:两次循环使用同一个查询集,第二次使用缓存中的数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
querylist=Entry.objects.all()
print([e.title for e in querylist])
print([e.title for e in querylist])
  • 何时查询集不会被缓存:当只对查询集的部分进行求值时会检查缓存,但是如果这部分不在缓存中,那么接下来查询返回的记录将不会被缓存,这意味着使用索引来限制查询集将不会填充缓存,如果这部分数据已经被缓存,则直接使用缓存中的数据

字段查询

  • 实现where子名,作为方法filter()、exclude()、get()的参数
  • 语法:属性名称__比较运算符=值
  • 表示两个下划线,左侧是属性名称,右侧是比较类型
  • 对于外键,使用“属性名_id”表示外键的原始值
  • 转义:like语句中使用了%与,匹配数据中的%与,在过滤器中直接写,例如:filter(title__contains="%")=>where title like '%\%%',表示查找标题中包含%的

比较运算符

  • exact:表示判等,大小写敏感;如果没有写“ 比较运算符”,表示判等
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(isDelete=False)
  • contains:是否包含,大小写敏感
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
exclude(btitle__contains='传')
  • startswith、endswith:以value开头或结尾,大小写敏感
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
exclude(btitle__endswith='传')
  • isnull、isnotnull:是否为null
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(btitle__isnull=False)
  • 在前面加个i表示不区分大小写,如iexact、icontains、istarswith、iendswith
  • in:是否包含在范围内
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(pk__in=[1, 2, 3, 4, 5])
  • gt、gte、lt、lte:大于、大于等于、小于、小于等于
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(id__gt=3)
  • year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(bpub_date__year=1980)
filter(bpub_date__gt=date(1980, 12, 31))
  • 跨关联关系的查询:处理join查询
    • 语法:模型类名 <属性名> <比较>
    • 注:可以没有__<比较>部分,表示等于,结果同inner join
    • 可返向使用,即在关联的两个模型中都可以使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(heroinfo_ _hcontent_ _contains='八')
  • 查询的快捷方式:pk,pk表示primary key,默认的主键是id
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(pk__lt=6)

聚合函数

  • 使用aggregate()函数返回聚合函数的值
  • 函数:Avg,Count,Max,Min,Sum
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
  • count的一般用法:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
count = list.count()

F对象

  • 可以使用模型的字段A与字段B进行比较,如果A写在了等号的左边,则B出现在等号的右边,需要通过F对象构造
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.filter(bread__gte=F('bcommet'))
  • django支持对F()对象使用算数运算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.filter(bread__gte=F('bcommet') * 2)
  • F()对象中还可以写作“模型类__列名”进行关联查询
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.filter(isDelete=F('heroinfo__isDelete'))
  • 对于date/time字段,可与timedelta()进行运算
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))

Q对象

  • 过滤器的方法中关键字参数查询,会合并为And进行
  • 需要进行or查询,使用Q()对象
  • Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与“比较运算符”中的相同
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db.models import Q
list.filter(Q(pk_ _lt=6))
  • Q对象可以使用&(and)、|(or)操作符组合起来
  • 当操作符应用在两个Q对象时,会产生一个新的Q对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.filter(pk_ _lt=6).filter(bcommet_ _gt=10)
list.filter(Q(pk_ _lt=6) | Q(bcommet_ _gt=10))
  • 使用~(not)操作符在Q对象前表示取反
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list.filter(~Q(pk__lt=6))
  • 可以使用&|~结合括号进行分组,构造做生意复杂的Q对象
  • 过滤器函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and
  • 过滤器函数可以混合使用Q对象和关键字参数,所有参数都将and在一起,Q对象必须位于关键字参数的前面

自连接

  • 对于地区信息,属于一对多关系,使用一张表,存储所有的信息
  • 类似的表结构还应用于分类信息,可以实现无限级分类
  • 新建模型AreaInfo,生成迁移
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AreaInfo(models.Model):
    atitle = models.CharField(max_length=20)
    aParent = models.ForeignKey('self', null=True, blank=True)
  • 访问关联对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
上级对象:area.aParent
下级对象:area.areainfo_set.all()
  • 加入测试数据(在workbench中,参见“省市区mysql.txt”)
  • 在booktest/views.py中定义视图area
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from models import AreaInfo
def area(request):
    area = AreaInfo.objects.get(pk=130100)
    return render(request, 'booktest/area.html', {'area': area})
  • 定义模板area.html
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head>
    <title>地区</title>
</head>
<body>
当前地区:{{area.atitle}}
<hr/>
上级地区:{{area.aParent.atitle}}
<hr/>
下级地区:
<ul>
    { %for a in area.areainfo_set.all%}
    <li>{{a.atitle}}</li>
    { %endfor%}
</ul>
</body>
</html>
  • 在booktest/urls.py中配置一个新的urlconf
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
    url(r'^area/$', views.area, name='area')
]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Django模型model
当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管理器
用户6256742
2024/06/22
1750
Django模型model
django model详解
1、安装pymysql模块 pip install pymysql 2、setting.py中设置引擎 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # postgresql / mysql / sqlite3 / oracle 'NAME': 'test1', # 数据库名 'USER': 'root', 'PASSWORD': 'root', 'HOST': 'localhost', # 本地:localhost 'PORT': '3306', # 默认端口:3306 } } 3、model使用流程 创建应用python manage.py startapp [应用名] settings.py中的 INSTALLED_APPS = [] 添加应用 models.py定义模型类 生成迁移python manage.py makemigrations 执行迁移python manage.py migrate 使用模型 4、字段:AutoField,BooleanField,CharField,IntegerField,FloatField,DateField,TimeField,DateTimeField,DecimalField,FileField,ImageField AutoField: 无需指定,自增长id BooleanField: Boolean类型,默认Flase;表单控件: CheckboxInput NullBooleanField: Boolean类型, 支持None, True, False CharField(max_length=字段长度20): 字符串 IntegerField: 整数 FloatField: 浮点数 DateField: datetime.date实例的日期 TimeField: datetime.time实例的时间 DecimalField(max_digits=位数总数None, decimal_places=小数点后的数字位数None): Decimal的十进制浮点数 DateTimeField([auto_now=修改时间戳False, auto_now_add=创建时间戳False]): datetime.datetime实例的日期和时间; 表单控件: TextInput + 日历控件
用户5760343
2022/05/14
7270
查询集 QuerySet和管理器Mana
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。
py3study
2020/01/16
1.1K0
web开发框架之Django基础
# 基本查询 print(BookInfo.objects.all()) print(BookInfo.objects.get(btitle='雪山飞狐').id) print(BookInfo.objects.get(id=3)) print(BookInfo.objects.get(pk=3)) # 将ID=3的排除,显示其他的 print(BookInfo.objects.exclude(id=3)) print(111111111) try:   print(BookInfo.objects.get(id=12)) # except Exception as e:
py3study
2020/01/17
6.1K0
Django—常用功能
项目中的CSS、图片、js都是静态文件。一般会将静态文件放到一个单独的目录中,以方便管理。在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件路径。静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。
py3study
2020/01/16
2.7K0
Django—常用功能
Django 分页和使用Ajax5.3
分页 Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数 属性 count:对象总数 num_pages:页面总数 page_range:页码列表,从1开始,例如[1, 2, 3, 4] 方法 page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常 异常exception InvalidPage:当向page()传入一个
Lansonli
2021/10/09
3K0
django框架菜鸟教程_django框架菜鸟教程
reverse反解析 使用reverse函数,可以根据路由名称,返回具体的路径,如: from django.urls import reverse # 注意导包路径
全栈程序员站长
2022/10/05
3.1K0
django 1.8 官方文档翻译: 2-2-1 执行查询
一旦你建立好数据模型之后,django会自动生成一套数据库抽象的API,可以让你执行增删改查的操作。这篇文档阐述了如何使用这些API。关于所有模型检索选项的详细内容,请见数据模型参考。
ApacheCN_飞龙
2022/11/27
4.4K0
python技术面试题(三)
When I let go of what I am, I become what I might be.
小闫同学啊
2019/07/18
1.1K0
python技术面试题(三)
django_2
要求 修改数据库 Django shell 数据级联(一对多) 元信息 定义字段 模型过滤 创建对象4种方式 查询集 过滤器 获取单个对象 字段查询 时间 聚合函数 跨关系查询 F对象 Q对象 学习课程 1.修改数据库 ① 在settings中的DATABASES中进行修改 ‘ENGINE’: ‘django.db.backends.mysql’, ’NAME‘ : 数据库名字 ’USER‘: 用户名字 ’PASSWORD‘:密码 ’HOST‘: 主机 ’PORT‘: 端口号 注意:引号加不加“”都
以某
2023/03/07
3.6K0
django_2
python Django 管理站点1.3
服务器 运行如下命令可以开启服务器 python manage.py runserver ip:port 可以不写ip,默认端口为8000 这是一个纯python编写的轻量级web服务器,仅在开发阶段使用 服务器成功启动后,提示如下信息 默认端口是8000,可以修改端口 python manage.py runserver 8080 打开浏览器,输入网址“127.0.0.1:8000”可以打开默认页面 如果修改文件不需要重启服务器,如果增删文件需要重启服务器 通过ctrl+c停止服务器 管理操作 站点分
Lansonli
2021/10/09
4990
Django框架学习(四)
我们如果是想在文件中直接运行,进行数据库的查询操作,可以按上面的步骤进行设置。并且在定义模型类的时候重写str方法(操作如下)。然后就可以进行查询了。
小闫同学啊
2019/07/18
1.5K0
Django框架学习(四)
DjangoRESTframework(补充)
版权声明:Copyright © https://blog.csdn.net/zzw19951261/article/details/80995504
zhengzongwei
2019/07/31
2.3K0
django模型
每个字段有一些特有的参数,例如,CharField(和它的派生类)需要max_length 参数来指定 VARCHAR 数据库字段的大小
程序员同行者
2018/08/16
3.1K0
四、其它(一)ModelAdmin对象InlineModelAdmin对象重写admin模板Paginator对象Page对象示例
一、管理静态文件 项目中的CSS、图片、js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] 在项目根目录下创建static目录,再创建当前应用名称的目录 mysite/static/myapp/ 在模板中可以使用硬编码 /static/my_app/myexample.jpg 在模板中可以使用static编码 { % l
酱紫安
2018/06/13
4.5K0
Django 聚合与查询集API实现侧边栏
1. 聚合的产生来源于django数据库查询,通常我们使用django查询来完成增删查改,但是有时候需要更复杂的方法才能完成对数据的提取、筛选、更改,所以需要一组对象聚合来完成这种操作。模型举例如下:
菲宇
2020/03/20
1.5K0
django_数据库操作—增、删、改、查
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
py3study
2020/01/15
1.3K0
Django—模型
ORM,全拼Object-Relation Mapping,中文意为对象-关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射ORM系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。O/R中字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。目前流行的ORM产品如Java的Hibernate,.Net的EntityFormerWork等。
py3study
2020/01/16
6.1K0
Django—模型
相关推荐
Django模型model
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文