1 ##################################################################
2 # PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET #
3 ##################################################################
4
5 def all(self)
6 # 获取所有的数据对象
7
8 def filter(self, *args, **kwargs)
9 # 条件查询
10 # 条件可以是:参数,字典,Q
11
12 def exclude(self, *args, **kwargs)
13 # 条件查询
14 # 条件可以是:参数,字典,Q
15
16 def select_related(self, *fields)
17 性能相关:表之间进行join连表操作,一次性获取关联的数据。
18
19 总结:
20 1. select_related主要针一对一和多对一关系进行优化。
21 2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。
22
23 def prefetch_related(self, *lookups)
24 性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。
25
26 总结:
27 1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。
28 2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。
29
30 def annotate(self, *args, **kwargs)
31 # 用于实现聚合group by查询
32
33 from django.db.models import Count, Avg, Max, Min, Sum
34
35 v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id'))
36 # SELECT u_id, COUNT(ui) AS `uid` FROM UserInfo GROUP BY u_id
37
38 v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id')).filter(uid__gt=1)
39 # SELECT u_id, COUNT(ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
40
41 v = models.UserInfo.objects.values('u_id').annotate(uid=Count('u_id',distinct=True)).filter(uid__gt=1)
42 # SELECT u_id, COUNT( DISTINCT ui_id) AS `uid` FROM UserInfo GROUP BY u_id having count(u_id) > 1
43
44 def distinct(self, *field_names)
45 # 用于distinct去重
46 models.UserInfo.objects.values('nid').distinct()
47 # select distinct nid from userinfo
48
49 注:只有在PostgreSQL中才能使用distinct进行去重
50
51 def order_by(self, *field_names)
52 # 用于排序
53 models.UserInfo.objects.all().order_by('-id','age')
54
55 def extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
56 # 构造额外的查询条件或者映射,如:子查询
57
58 Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
59 Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
60 Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
61 Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
62
63 def reverse(self):
64 # 倒序
65 models.UserInfo.objects.all().order_by('-nid').reverse()
66 # 注:如果存在order_by,reverse则是倒序,如果多个排序则一一倒序
67
68
69 def defer(self, *fields):
70 models.UserInfo.objects.defer('username','id')
71 或
72 models.UserInfo.objects.filter(...).defer('username','id')
73 #映射中排除某列数据
74
75 def only(self, *fields):
76 #仅取某个表中的数据
77 models.UserInfo.objects.only('username','id')
78 或
79 models.UserInfo.objects.filter(...).only('username','id')
80
81 def using(self, alias):
82 指定使用的数据库,参数为别名(setting中的设置)
83
84
85 ##################################################
86 # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
87 ##################################################
88
89 def raw(self, raw_query, params=None, translations=None, using=None):
90 # 执行原生SQL
91 models.UserInfo.objects.raw('select * from userinfo')
92
93 # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
94 models.UserInfo.objects.raw('select id as nid from 其他表')
95
96 # 为原生SQL设置参数
97 models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
98
99 # 将获取的到列名转换为指定列名
100 name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
101 Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
102
103 # 指定数据库
104 models.UserInfo.objects.raw('select * from userinfo', using="default")
105
106 ################### 原生SQL ###################
107 from django.db import connection, connections
108 cursor = connection.cursor() # cursor = connections['default'].cursor()
109 cursor.execute("""SELECT * from auth_user where id = %s""", [1])
110 row = cursor.fetchone() # fetchall()/fetchmany(..)
111
112
113 def values(self, *fields):
114 # 获取每行数据为字典格式
115
116 def values_list(self, *fields, **kwargs):
117 # 获取每行数据为元祖
118
119 def dates(self, field_name, kind, order='ASC'):
120 # 根据时间进行某一部分进行去重查找并截取指定内容
121 # kind只能是:"year"(年), "month"(年-月), "day"(年-月-日)
122 # order只能是:"ASC" "DESC"
123 # 并获取转换后的时间
124 - year : 年-01-01
125 - month: 年-月-01
126 - day : 年-月-日
127
128 models.DatePlus.objects.dates('ctime','day','DESC')
129
130 def datetimes(self, field_name, kind, order='ASC', tzinfo=None):
131 # 根据时间进行某一部分进行去重查找并截取指定内容,将时间转换为指定时区时间
132 # kind只能是 "year", "month", "day", "hour", "minute", "second"
133 # order只能是:"ASC" "DESC"
134 # tzinfo时区对象
135 models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.UTC)
136 models.DDD.objects.datetimes('ctime','hour',tzinfo=pytz.timezone('Asia/Shanghai'))
137
138 """
139 pip3 install pytz
140 import pytz
141 pytz.all_timezones
142 pytz.timezone(‘Asia/Shanghai’)
143 """
144
145 def none(self):
146 # 空QuerySet对象
147
148
149 ####################################
150 # METHODS THAT DO DATABASE QUERIES #
151 ####################################
152
153 def aggregate(self, *args, **kwargs):
154 # 聚合函数,获取字典类型聚合结果
155 from django.db.models import Count, Avg, Max, Min, Sum
156 result = models.UserInfo.objects.aggregate(k=Count('u_id', distinct=True), n=Count('nid'))
157 ===> {'k': 3, 'n': 4}
158
159 def count(self):
160 # 获取个数
161
162 def get(self, *args, **kwargs):
163 # 获取单个对象
164
165 def create(self, **kwargs):
166 # 创建对象
167
168 def bulk_create(self, objs, batch_size=None):
169 # 批量插入
170 # batch_size表示一次插入的个数
171 objs = [
172 models.DDD(name='r11'),
173 models.DDD(name='r22')
174 ]
175 models.DDD.objects.bulk_create(objs, 10)
176
177 def get_or_create(self, defaults=None, **kwargs):
178 # 如果存在,则获取,否则,创建
179 # defaults 指定创建时,其他字段的值
180 obj, created = models.UserInfo.objects.get_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 2})
181
182 def update_or_create(self, defaults=None, **kwargs):
183 # 如果存在,则更新,否则,创建
184 # defaults 指定创建时或更新时的其他字段
185 obj, created = models.UserInfo.objects.update_or_create(username='root1', defaults={'email': '1111111','u_id': 2, 't_id': 1})
186
187 def first(self):
188 # 获取第一个
189
190 def last(self):
191 # 获取最后一个
192
193 def in_bulk(self, id_list=None):
194 # 根据主键ID进行查找
195 id_list = [11,21,31]
196 models.DDD.objects.in_bulk(id_list)
197
198 def delete(self):
199 # 删除
200
201 def update(self, **kwargs):
202 # 更新
203
204 def exists(self):
205 # 是否有结果
206
207 QuerySet方法大全
1 import os,sys
2
3 if __name__ == '__main__':
4 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ormday71.settings")
5 import django
6 django.setup()
7
8 from app01 import models
9 # ret = models.Employee.objects.all().values("id","dept")
10 # print(ret)
11
12 from django.db.models import Avg
13 #ORM分组关键字annotate
14 # ret = models.Employee.objects.values("dept").annotate(avg=Avg("salary")).values("dept","avg")
15 # print(ret)
16
17 # ret = models.Employee2.objects.values("dept_id").annotate(avg=Avg("salary")).values("dept__name", "avg")
18 # print(ret)
19
20
21 #查所有的员工和部门名称
22 # ret = models.Employee2.objects.values("name","dept__name")
23 # print(ret)
24 #
25 # ret = models.Employee2.objects.select_related().values("name","dept__name")
26 # print(ret)
27
28 #select_related主要针一对一和多对一关系进行优化
29 #查询所有的作者
30 ret = models.Author.objects.select_related().values("name","books__title")
31 print(ret)
32 print("="*120)
33 ret = models.Author.objects.prefetch_related().values("name", "books__title")
34 print(ret)
35
36 #批量创建
37 #有100个书籍对象
38 objs = [models.Book(title="沙河{}".format(i)) for i in range(100)]
39
40 #在数据库中批量创建
41 #10次一提交,减少了数据库连接的次数
42 models.Book.objects.bulk_create(objs,10)