Django之ORM相关操作
一般操作
常用的13个操作
<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 <6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <7> order_by(*field): 对查询结果排序 <8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。 <9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。) <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <11> first(): 返回第一条记录 <12> last(): 返回最后一条记录 <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
返回QuerySet对象的方法有
all() filter() exclude() order_by() reverse() distinct()
特殊的QuerySet
values() 返回一个可迭代的字典序列 values_list() 返回一个可迭代的元祖序列
返回具体的对象
get()
first()
last()
返回布尔值
exists()
返回数字
count()
单表查询常用操作
gt - Greater than
大于
例:
models.Person.objects.filter(id__gt=4) # 获取id大于4的值
对应的SQL语句:
SELECT ... WHERE id > 4;
gte - Greater than or equal to
大于或等于
lt - Less than
小于
lte - Less than or equal to
小于或等于
例: 获得id大于2且小于5的值
models.Person.objects.filter(id__gt=2, id__lt=5)
in
给定的是可迭代的, 通常是列表, 元组或者queryset.
例:
models.Person.objects.filter(id__in=[1, 3]) # 获取id等于1, 3的数据
对应的SQL语句:
SELECT ... WHERE id IN (1, 3);
contains
区分大小写
例:
models.Person.objects.filter(name__contains='a') # 获取name字段中包含"a"的数据
对应的SQL语句:
SELECT ... WHERE name LIKE '%a%';
icontains
不区分大小写
例:
models.Person.objects.filter(name__contains='a') # 获取name字段中包含"a"或者"A"的数据
对应的SQL语句:
SELECT ... WHERE name ILIKE '%a%';
range
包括两边的边界值
例:
models.Person.objects.filter(id__range=[1, 3]) # id范围是1到3
对应的SQL语句:
SELECT ... WHERE id BETWEEN 1 and 3;
startswith
以...开头, 区分大小写
例:
models.Person.objects.filter(name__startswith='a')
对应的SQL语句:
SELECT ... WHERE name LIKE 'a%';
类似的:
istartswith
以...开头, 不区分大小写
endswith
以...结尾, 区分大小写
iendswith
以...结尾, 不区分大小写
year
例:
models.Person.objects.filter(birth__year=2019)
对应的SQL语句:
SELECT ... WHERE birth BETWEEN '2019-01-01' AND '2019-12-31';
ForeignKey操作
正向查找
对象查找(跨表)
语法:
对象.关联字段.字段
例:
book_obj = models.Book.objects.first() # 第一本书对象
print(book_obj.press) # 得到这本书关联的出版社对象
print(book_obj.press.name) # 得到出版社对象的名称
字段查找(跨表)
语法:
关联字段__字段
例:
print(models.Book.objects.values('press__name'))
obj = models.Book.objects.filter(press__name='xx出版社')
print(obj)
反向查找
对象查找
语法:
默认:
obj.表名_set 表名_set可以自己命名
例:
press_obj = models.Press.objects.first() # 找到第一个出版社对象
books = press_obj.books.all() # 找到第一个出版社出版的所有书
titles = books.values_list('title') # 找到第一个出版社出版的所有书的书名
print(books)
print(titles)
字段查找
语法:
表名__字段
例:
titles = models.Press.objects.values_list('books__title')
# books__title中的books是自己在models.py中, related_name='books'
# 具体的代码:
class Book(models.Model):
title = models.CharField(max_length=32)
press = models.ForeignKey(to='Press', on_delete=models.CASCADE, related_name='books')
ManyToManyField
class RelatedManager
"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。
它存在于下面两种情况:
- 外键关系的反向查询
- 多对多关联关系
简单来说就是当 点 后面的对象 可能存在多个的时候就可以使用以下的方法。
方法
create()
创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。
obj = models.Author.objects.first()
obj.books.create(title='一起来学MATLAB', press_id=2)
add()
把指定的model对象添加到关联对象集中。
添加对象
obj = models.Author.objects.first()
obj.books.add(*models.Book.objects.all())
添加id
obj = models.Author.objects.first()
obj.books.add(*[3, 4])
set()
更新model对象的关联对象
obj = models.Author.objects.first()
obj.books.set([1, 2])
remove()
从关联对象集中移除执行的model对象
obj = models.Author.objects.first()
obj.books.remove(1)
clear()
从关联对象集中移除一切对象
obj = models.Author.objects.first()
obj.books.clear()
注意:
对于ForeignKey对象,clear() 和 remove() 方法仅在 null=True 时存在。
详情见 Django官方文档
Django之ORM相关操作的更多相关文章
- Django框架详细介绍---ORM相关操作
Django ORM相关操作 官方文档: https://docs.djangoproject.com/en/2.0/ref/models/querysets/ 1.必须掌握的十三个方法 <1& ...
- Django【第5篇】:Django之ORM数据库操作
django之ORM数据库操作 一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录-------- ...
- Django中的ORM相关操作:F查询,Q查询,事物,ORM执行原生SQL
一 F查询与Q查询: 1 . F查询: 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的 ...
- Django models ORM基础操作--白话聊Django系列
上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个 ...
- Django之ORM表操作
ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import models def ...
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
- Django框架详细介绍---ORM相关操作---select_related和prefetch_related函数对 QuerySet 查询的优化
Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化 引言 在数据库存在外键的其情况下,使用select_related()和pre ...
- Django框架——基础之模型系统(ORM相关操作)
------------恢复内容开始------------ 1.必定会的十三条! 1.1记忆方法一:(按字母顺序记忆) <1> all(): 查询所有结果 <2> cou ...
- Django框架(八) Django之ORM数据库操作
创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系( ...
随机推荐
- PHP 之CI框架+GatewayWorker+AmazeUI低仿微信聊天网页版
html5开发的仿微信网页版聊天,采用html5+css3+jquery+websocket+amazeui等技术混合架构开发,实现了微信网页版的主要功能. 一.效果图 二.前端参考代码 <!D ...
- [信息收集]Nmap命令详解
0x00[介绍] Nmap,也就是Network Mapper,中文为"网络映射器". Nmap是一款开源的网络探测和安全审核的工具,它的设计目标是快速地扫描大型网络. 它是网络管 ...
- linux和window下生成任意大小的文件
在Windows环境下的实现方法 使用fsutil命令,在windows xp和win 7下应该都自带了这个命令.命令的格式是 fsutil file createnew 新文件名 文件大小.例如 ...
- OpenTK学习笔记(2)-工作窗口的三种方法创建方法(winfrom窗体控件形式创建)
参考资料: https://social.msdn.microsoft.com/Forums/zh-TW/1b781685-c670-4338-953d-1957a8f24a66/opentkglco ...
- 对请求数据的格式化 方案 Spring Cloud Gateway features:
对请求数据的格式化 例如 {body:{}}--->{data:{}} 执行阶段概念 · OpenResty最佳实践 · 看云 https://www.kancloud.cn/kancloud/ ...
- GIS 空间分析案例教程-坐标高斯投影正反算
GIS 空间分析案例教程-坐标高斯投影正反算 商务科技合作:向日葵,135-4855__4328,xiexiaokui#qq.com 特点: 1. 地理处理工具,可以与任何arcgis 工具和语言集成 ...
- 如何确认oracle客户端中的TNSNAMES中的service_name
在我们安装oracle的客户端,或者PLSQL develop的时候,需要在oracle的安装目录下修改TNSNAME中配置你要连接的数据库的TNS参数.配置好了可以通过命令行使用tnsping命令测 ...
- 整理Mac系统 node-sass 安装失败的原因及解决办法
转载与:https://segmentfault.com/a/1190000010984731 声明:本文非原创,如有侵权请留言或发邮件告知,作者会立即停止侵权并删除本文.发布此文章主要是希望跟作者遇 ...
- 【422】Insert often-used pieces of text in gedit
Ref: Snippets Enable Snippets Plugin Browse Snippets Using Snippets To insert a nippet into your cur ...
- 树形DP入门学习
这里是学习韦神的6道入门树形dp进行入门,本来应放在day12&&13里,但感觉这个应该单独放出来好点. 这里大部分题目都是参考的韦神的思想. A - Anniversary part ...