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)