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)