模型层中QuerySet的学习
创建对象
使用关键字参数实例化模型实例来创建一个对象,然后调用save()把它保存到数据库中
pub_obj = models.Publisher(title='奥利给出版社')
pub_obj.save() //该方法没有返回值
上面的代码在背后执行了SQL 的Insert语句。 在你显式调用save()之前,Django 不会访问数据库。
如果你想只用一条语句创建并保存一个对象,使用create()方法。
将更改保存到对象
要保存对数据库中已存在的对象的改动,请使用save()。
假设Publisher的一个实例pub_obj已经被保存在数据库中,下面这个例子将更改它的name并且更新数据库中的记录:
>>> pub_obj.name = '哈麻皮出版社'
>>> pub_obj.save()
上面的代码在背后执行SQL 的UPDATE语句。 在你显式调用save()之前,Django 不会访问数据库。
链式过滤器
QuerySet的筛选结果本身还是QuerySet,所以可以将筛选语句链接在一起
models.Author.objects.filter(xxx).exclude(xxx)
限制QuerySet
可以使用Python 的切片语法来限制QuerySet记录的数目 。 它等同于SQL 的OFFSET 和LIMIT子句。
例如,下面的语句返回前面5 个对象(LIMIT 5):
>>> Author.objects.all()[:5]
下面这条语句返回第6 至第10 个对象(OFFSET 5 LIMIT 5):
>>> Author.objects.all()[5:10]
不支持负的索引(例如Author.objects.all()[-1])。
字段查找
常用字段
__lte //小于等于
__lt //小于
_id //查找外键id为xxx的对象
__exact //精准匹配 如果你没有提供查询类型 —— 即如果你的关键字参数不包含双下划线 —— 默认假定查询类型是exact。iexact 忽略大小写
__contains //包含 icontains忽略大小写
__in //在给定的列表里
__startswith //以什么开头 istartswith不区分大小写
__endswith //以什么结尾 iendswith不区分大小写
__range //范围测试(包含于之中)
__isnull //值为 False 或 True, 相当于 SQL语句IS NULL和IS NOT NULL.
跨表查询
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理join。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
>>> Blog.objects.filter(entry__headline='Lennon')
注:__表示跨一张表
关联对象
正向查询
>>> e = Entry.objects.get(id=2)
>>> e.blog # 返回blog关系管理对象
>>> e.blog.all # 返回blogQuerySet
反向查询
如果模型有一个ForeignKey,那么该ForeignKey所指的模型实例可以通过一个Manager返回第一个模型的所有实例。 默认情况下,这个Manager的名字为FOO_set,其中FOO是源模型的小写名称。 该Manager返回QuerySets,可以用上一节提到的方式进行过滤和操作。
例如:
>>> b = Blog.objects.get(id=1)
>>> b.entry_set.all() # Returns all Entry objects related to Blog.
# b.entry_set is a Manager that returns QuerySets.
>>> b.entry_set.filter(headline__contains='Lennon')
>>> b.entry_set.count()
你可以在ForeignKey定义时设置related_name参数来覆盖FOO_set 的名称。 例如,如果Entry模型更改为blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries'),上述示例代码如下所示:
>>> b = Blog.objects.get(id=1)
>>> b.entries.all() # Returns all Entry objects related to Blog.
# b.entries is a Manager that returns QuerySets.
>>> b.entries.filter(headline__contains='Lennon')
>>> b.entries.count()
处理关系管理对象的其他方法
add(obj1, obj2, ...)
添加一指定的模型对象到关联的对象集中。
create(**kwargs)
创建一个新的对象,将它保存并放在关联的对象集中。 返回新创建的对象。
remove(obj1, obj2, ...)
从关联的对象集中删除指定的模型对象。
clear()
从关联的对象集中删除所有的对象。
set(objs)
替换相关对象集。
ORM常见操作
filter //返回一个新的QuerySet,它包含满足查询参数的对象
exclude //返回一个新的QuerySet,它包含不满足给定的查找参数的对象
order_by //排序,-号为降序,默认升序
reverse //反转
distinct //去重
values //返回QuerySet,里面包含字典对象
values_list // 返回QuerySet,里面包含元组
count //返回个数
exists //判断是否存在
first //返回第一个对象
last //返回最后一个对象
delete //删除
Q
在filter()中的关键字参数查询 — 是“AND”的关系。 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q对象。
Q(question__startswith='Who') | Q(question__startswith='What') //|取或
~Q(pub_date__year=2005) // ~取反
F
一个 F()对象代表了一个model的字段值或注释列。 使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中。
相反,Django使用F()对象生成描述数据库级所需操作的SQL表达式。
from django.db.models import F
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed = F('stories_filed') + 1
reporter.save()
F()表达式的效率上的优点主要体现在
- 直接通过数据库操作而不是Python
- 减少数据库查询次数
模型层中QuerySet的学习的更多相关文章
- DRF 序列化组件 模型层中参数补充
一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...
- Django中模型层中ORM的单表操作
ORM概念: MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...
- Django中模型层中ORM的多表操作
ORM的多表创建(一对一.一对多,多对多): 1模型创建 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等 ...
- Django模型层ORM学习笔记
一. 铺垫 1. 连接Django自带数据库sqlite3 之前提到过Django自带一个叫做sqlite3的小型数据库,当我们做本地测试时,可以直接在sqlite3上测试.不过该数据库是小型的,在有 ...
- Django框架-模型层3/数据传输/Ajax
目录 一.orm查询优化 1.only与defer 2.select_related与prefatch_related 二.模型层choices参数 三.MTV与MVC模型 1.MVC 2.MTV 3 ...
- WEB框架-Django框架学习(二)- 模型层
今日份整理为模型层 1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库, ...
- Django学习之模型层
模型层 查看orm内部sql语句的方法的方法 1.如果是queryset对象,那么可以点query直接查看该queryset的内部sql语句 2.在Django项目的配置文件中,配置一下参数即可实现所 ...
- 【Django】模型层说明
[Django模型层] 之前大概介绍Django的文章居然写了两篇..这篇是重点关注了Django的模型层来进行学习. ■ 模型定义 众所周知,Django中的模型定义就是定义一个类,其基本结构是这样 ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
随机推荐
- 三类安装VMTools失败的解决方法(Windows、Linux、MacOs)
前言 写这篇笔记的原因,是前几天在虚拟机 Vmware 中重新安装了几个操作系统,突然发现 VMTools 这个工具成了一个特殊的问题,以前还没有发现,因为通常它就给你自动安装了.但是大多数时候也是需 ...
- [转]Java死锁排查
文章来源:微信公众号:猿天地 1. 死锁的概念: 是Java多线程情况下,两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用,它们都讲无法推进下去.此时称 ...
- day23:单继承&多继承&菱形继承&__init__魔术方法
1.单继承 1.1 关于继承的一些基本概念 1.2 子类可以调用父类的公有成员 1.3 子类无法调用父类的私有成员 1.4 子类可以改写父类的方法 2.多继承 2.1 多继承的基本语法 2.2 sup ...
- boost之signal的使用
文章目录 简介 代码 模板实现: 测试代码 运行结果 简介 boost是C++的一个扩展库,被称为C++准标准库,里面的组件很丰富,并且引用方便,85%的组件只需要引用头文件即可使用. 并且在嵌入式系 ...
- C++ Json工具--Jsoncpp用法简介
文章目录 Json简介 用法简介 数据类型 C++代码示例 代码执行输出结果 JSON在线解析及格式化验证 - JSON.cn Json简介 JSON(JavaScript Object Notati ...
- Python 爬虫工程师必看,深入解读字体反爬虫
字体反爬虫开篇概述 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人 ...
- Python初学者的自我修养,找到自己的方向
今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...
- MYSQL 按某个字段分组,然后取每组前3条记录
先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid 都只有 3 条记录. SQL语句为: SELECT * FROM test main WHERE ...
- 【av68676164(p25-p30)】同步和P-V操作
4.5 同步和P-V操作 4.5.1 同步和互斥的概念 进程的互斥关系 例子 进程的互斥关系 多个进程由于共享了独占性资源,必须协调个进程对资源的存取顺序:确保没有两个或以上的进程同时进行存取操作. ...
- LDAP 使用记录
LDAP 命令记录 工作中用到了 LDAP,做一个简单记录. 概念性的东西不做阐述,只是记录常用命令,以便将来回顾. 想多做了解可以参考这个系列文章: https://blog.csdn.net/li ...