天天看点

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

=

models.UserInfo.objects.values(

'u_id'

).annotate(uid

=

Count(

'u_id'

))

# SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id

=

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

=

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

):

# 是否有结果