QuerySet方法大全
##################################################################
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
##################################################################
def
all
(
self
)
# 获取所有的数据对象
def
filter
(
self
,
*
args,
*
*
kwargs)
# 条件查询
# 条件可以是:参数,字典,Q
def
exclude(
self
,
*
args,
*
*
kwargs)
# 条件查询
# 条件可以是:参数,字典,Q
def
select_related(
self
,
*
fields)
性能相关:表之间进行join连表操作,一次性获取关联的数据。
总结:
1.
select_related主要针一对一和多对一关系进行优化。
2.
select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。
def
prefetch_related(
self
,
*
lookups)
性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。
总结:
1.
对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。
2.
prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。
def
annotate(
self
,
*
args,
*
*
kwargs)
# 用于实现聚合group by查询
from
django.db.models
import
Count, Avg,
Max
,
Min
,
Sum
v
=
models.UserInfo.objects.values(
'u_id'
).annotate(uid
=
Count(
'u_id'
))
# SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id
v
=
models.UserInfo.objects.values(
'u_id'
).annotate(uid
=
Count(
'u_id'
)).
filter
(uid__gt
=
1
)
# SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
v
=
models.UserInfo.objects.values(
'u_id'
).annotate(uid
=
Count(
'u_id'
,distinct
=
True
)).
filter
(uid__gt
=
1
)
# SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
def
distinct(
self
,
*
field_names)
# 用于distinct去重
models.UserInfo.objects.values(
'nid'
).distinct()
# select distinct nid from userinfo
注:只有在PostgreSQL中才能使用distinct进行去重
def
order_by(
self
,
*
field_names)
# 用于排序
models.UserInfo.objects.
all
().order_by(
'-id'
,
'age'
)
def
extra(
self
, select
=
None
, where
=
None
, params
=
None
, tables
=
None
, order_by
=
None
, select_params
=
None
)
# 构造额外的查询条件或者映射,如:子查询
Entry.objects.extra(select
=
{
'new_id'
:
"select col from sometable where othercol > %s"
}, select_params
=
(
1
,))
Entry.objects.extra(where
=
[
'headline=%s'
], params
=
[
'Lennon'
])
Entry.objects.extra(where
=
[
"foo='a' OR bar = 'a'"
,
"baz = 'a'"
])
Entry.objects.extra(select
=
{
'new_id'
:
"select id from tb where id > %s"
}, select_params
=
(
1
,), order_by
=
[
'-nid'
])
def
reverse(
self
):
# 倒序
models.UserInfo.objects.
all
().order_by(
'-nid'
).reverse()
# 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序
def
defer(
self
,
*
fields):
models.UserInfo.objects.defer(
'username'
,
'id'
)
或
models.UserInfo.objects.
filter
(...).defer(
'username'
,
'id'
)
#映射中排除某列数据
def
only(
self
,
*
fields):
#仅取某个表中的数据
models.UserInfo.objects.only(
'username'
,
'id'
)
或
models.UserInfo.objects.
filter
(...).only(
'username'
,
'id'
)
def
using(
self
, alias):
指定使用的数据库,参数为别名(setting中的设置)
##################################################
# PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
##################################################
def
raw(
self
, raw_query, params
=
None
, translations
=
None
, using
=
None
):
# 执行原生SQL
models.UserInfo.objects.raw(
'select * from userinfo'
)
# 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
models.UserInfo.objects.raw(
'select id as nid from 其他表'
)
# 为原生SQL设置参数
models.UserInfo.objects.raw(
'select id as nid from userinfo where nid>%s'
, params
=
[
12
,])
# 将获取的到列名转换为指定列名
name_map
=
{
'first'
:
'first_name'
,
'last'
:
'last_name'
,
'bd'
:
'birth_date'
,
'pk'
:
'id'
}
Person.objects.raw(
'SELECT * FROM some_other_table'
, translations
=
name_map)
# 指定数据库
models.UserInfo.objects.raw(
'select * from userinfo'
, using
=
"default"
)
################### 原生SQL ###################
from
django.db
import
connection, connections
cursor
=
connection.cursor()
# cursor = connections['default'].cursor()
cursor.execute(
"""SELECT * from auth_user where id = %s"""
, [
1
])
row
=
cursor.fetchone()
# fetchall()/fetchmany(..)
def
values(
self
,
*
fields):
# 获取每行数据为字典格式
def
values_list(
self
,
*
fields,
*
*
kwargs):
# 获取每行数据为元祖
def
dates(
self
, field_name, kind, order
=
'ASC'
):
# 根据时间进行某一部分进行去重查找并截取指定内容
# kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)
# order只能是:"ASC" "DESC"
# 并获取转换后的时间
-
year : 年
-
01
-
01
-
month: 年
-
月
-
01
-
day : 年
-
月
-
日
models.DatePlus.objects.dates(
'ctime'
,
'day'
,
'DESC'
)
def
datetimes(
self
, field_name, kind, order
=
'ASC'
, tzinfo
=
None
):
# 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
# kind只能是 "year", "month", "day", "hour", "minute", "second"
# order只能是:"ASC" "DESC"
# tzinfo时区对象
models.DDD.objects.datetimes(
'ctime'
,
'hour'
,tzinfo
=
pytz.UTC)
models.DDD.objects.datetimes(
'ctime'
,
'hour'
,tzinfo
=
pytz.timezone(
'Asia/Shanghai'
))
"""
pip3 install pytz
import pytz
pytz.all_timezones
pytz.timezone(‘Asia/Shanghai’)
"""
def
none(
self
):
# 空QuerySet对象
####################################
# METHODS THAT DO DATABASE QUERIES #
####################################
def
aggregate(
self
,
*
args,
*
*
kwargs):
# 聚合函数,获取字典类型聚合结果
from
django.db.models
import
Count, Avg,
Max
,
Min
,
Sum
result
=
models.UserInfo.objects.aggregate(k
=
Count(
'u_id'
, distinct
=
True
), n
=
Count(
'nid'
))
=
=
=
> {
'k'
:
3
,
'n'
:
4
}
def
count(
self
):
# 获取个数
def
get(
self
,
*
args,
*
*
kwargs):
# 获取单个对象
def
create(
self
,
*
*
kwargs):
# 创建对象
def
bulk_create(
self
, objs, batch_size
=
None
):
# 批量插入
# batch_size表示一次插入的个数
objs
=
[
models.DDD(name
=
'r11'
),
models.DDD(name
=
'r22'
)
]
models.DDD.objects.bulk_create(objs,
10
)
def
get_or_create(
self
, defaults
=
None
,
*
*
kwargs):
# 如果存在,则获取,否则,创建
# defaults 指定创建时,其他字段的值
obj, created
=
models.UserInfo.objects.get_or_create(username
=
'root1'
, defaults
=
{
'email'
:
'1111111'
,
'u_id'
:
2
,
't_id'
:
2
})
def
update_or_create(
self
, defaults
=
None
,
*
*
kwargs):
# 如果存在,则更新,否则,创建
# defaults 指定创建时或更新时的其他字段
obj, created
=
models.UserInfo.objects.update_or_create(username
=
'root1'
, defaults
=
{
'email'
:
'1111111'
,
'u_id'
:
2
,
't_id'
:
1
})
def
first(
self
):
# 获取第一个
def
last(
self
):
# 获取最后一个
def
in_bulk(
self
, id_list
=
None
):
# 根据主键ID进行查找
id_list
=
[
11
,
21
,
31
]
models.DDD.objects.in_bulk(id_list)
def
delete(
self
):
# 删除
def
update(
self
,
*
*
kwargs):
# 更新
def
exists(
self
):
# 是否有结果
QuerySet方法大全相关推荐
- robo3t 连接服务器数据库_车牌识别软件连接各种数据库方法大全
软件连接各种数据库方法大全 1:软件连接免安装数据库. 免安装数据库使用方便,不受操作系统版本影响,不用安装,解压打开运行即可,所以免安装数据库不要放在桌面上,也不要解压打开多个. 打开车牌识别软件, ...
- C语言常用排序方法大全
C语言常用排序方法大全 /* ============================================================================= 相关知识介绍( ...
- python基础30个常用代码大全-Python3列表内置方法大全及示例代码小结
Python中的列表是简直可说是有容乃大,虽然看似类似C中的数组,但是Python列表可以接受任意的对象元素,比如,字符串,数字,布尔值,甚至列表,字典等等,自由度提升到一个新的高度,而Python也 ...
- mysql删除重复文章标题_MySQL中查询、删除重复记录的方法大全
前言 本文主要给大家介绍了关于MySQL中查询.删除重复记录的方法,分享出来供大家参考学习,下面来看看详细的介绍: 查找所有重复标题的记录: 一.查找重复记录 1.查找全部重复记录 2.过滤重复记录( ...
- IT 巡检内容、方法大全
IT 巡检内容.方法大全 目 录 1. 概述 2. 巡检维度 3. 巡检内容 4. 巡检方法 5. 常用命令.常见问题和解决方法 6. 附录 1 词汇表 7. 附录 2 参考资料 1. ...
- js检测字符串方法大全
js检测字符串方法大全 <script> /* function obj$(id) 根据id得到对象 function val$(id) ...
- java读取文件的方法是_Java读取文件方法大全
Java读取文件方法大全 2011/11/25 9:18:42 tohsj0806 http://tohsj0806.iteye.com 我要评论(0) 摘要:文章来源:http://www.c ...
- SEO搜索引擎优化排名方法大全
SEO搜索引擎优化排名方法大全 正确的搜索引擎优化可以有效的帮助网站得到正确的排名,仅此而已,这也是我写这篇文章的目的. 过度优化甚至作弊不但费时费力,而且对网站没有实际帮助. 提高在搜索引擎中排名的 ...
- 生成osm文件_超酷城市肌理!地理数据信息爬取方法大全(B篇)DEM+POI+OSM
WENWEN:这一弹是对第一弹的补充和深化讲解,上一弹请点击常用的地理数据信息爬取方法大全(前期场地信息获取第一弹),关于DEM获取地形地理空间数据云提交任务一直在排队的问题,这个应该是官网的问题,不 ...
最新文章
- 转帖:HttpStatusCode状态说明C#版
- 爬过这 6 个坡,你就能对 Linux 操作系统了如指掌
- 【转】 Ubuntu 11.04 下安装配置 JDK 7
- nefu 753 n!末尾有多少个0
- 在Xcode8中 如何添加.pch文件
- 图【数据结构F笔记】
- IDEA——修改idea64.exe.vmoptions文件解决coding卡顿问题
- MySql关键字-保留字
- python中如何计算集合的长度_Python如何计算序列长度 python dataframe中元素如何统计?...
- BZOJ5249:[九省联考2018]IIIDX——题解
- ZXing拍码后区分扫描到的是一维码、二维码、其他码,android音视频面试
- 【Google浏览器无法登录账号】为安全起见,您无法从此设备登录。请稍后重试,或从其他设备登录
- 【idea使用】主题文字修改
- OpenCV 自带示例sample中的双目校正stereo_calib.cpp 安装与解读
- 关于MATLAB直方图的绘制及应用
- 利用公式实现RGB图转化为灰度图
- 压缩图片大小至指定Kb以下
- 如何解决万能地图下载器下载的地图和选择范围不一致
- 【docker】gitlab + qqmail配置SMTP
- 微信小程序 java springboot理发店美容店预约系统
热门文章
- Python的pickle模块详解(包括优缺点及和JSON的区别)
- UI设计一般要学什么内容 相关学习路线是什么
- 与庄子何干--听于丹教授讲庄子
- 百度浏览器屏蔽H5固定在底部按钮之解决方案
- MySQL笔记:B站康师傅天花板教程(持续更新)
- 第6章 写一个块设备驱动
- [附源码]计算机毕业设计JAVA日常饮食健康推荐系统
- minicom指令_串口调试利器--Minicom配置及使用详解.md
- Linux安装jdk替换默认open jdk
- matlab火星漫游车转向控制,ExoMy DIY漫游车让人们打造属于自己的火星探测器