Django08-1:模型層(ORM)--聚合查詢/分組查詢/F與Q查詢/開啟事務/常用字段及參數/自定義字段/數據庫查詢優化

聚合查詢

單獨使用時,用aggregate

1.只要是跟數據庫相關的模塊

????? 基本都在django.db.models里面

?????? 如果沒有應該在django.db里面

2. 聚合查詢通常配合分組使用


from django.db.models import Avg, Sum, Max, Min, Count# 1.所有書的平均價格
res=models.Book.objects.aggregate('price')ret = models.Book.objects.all().aggregate(price_avg=Avg("price"), price_max=Max("price"), price_min=Min("price"))

?

分組查詢

annotate

models后面點什么,就是什么分組

# 1.查詢每一本書的作者個數
ret = models.Book.objects.all().annotate(author_num=Count("author")).values('title','author_num')
print(ret)#author_num 自定義字段,用來統計每本書個數。#等價
ret = models.Book.objects.all().annotate(author_num=Count("author__pk")).values('title','author_num')
print(ret)

只要結果是queryset對象,就可以繼續.filter()和.values()

#2.統計每個出版社的最便宜書的價格
res=models.Publish.objects.annote(min_price=Min('book__price')).values('name','min_price')#3. 統計不止一個作者的圖書#a.先分組書籍,求每一步書籍的作者個數#b. 過濾不止一個作者的書籍
res=models.Book.objects.annote(author_num=Count('authors')).filter(author_num__gt=1).value('title','author_num')
#4. 查詢每個作者出的書的總價格
res=models.Author.objects.annotate(sum_price=Sum('book__price')).values('name','sum_price')

擴展,其他分組方式

models.Book.values('price').annotate()

分組報錯情況:去掉嚴格模式

?

F與Q查詢

F功能:直接獲取表中某個字段對應的數據

操作字符時,F不能直接做到字符拼接,

否則變成空白

# 1.查詢賣出數大于庫存書的書籍# F查詢
from django.db.models import Fres=models.Book.objects.filter(maichu__gt=F('kuncun'))# 2.將所有書的價格提升50
models.Book.objects.update(price=F('price')+50)# 3.將所有書的名字后面加“爆款”兩個字
#***操作字符時,F不能直接做到字符拼接
#***否則變成空白#需要導入兩個模塊
from django.db.models.functions import Concat
from django.db.models import Valuemodels.Book.objects.update(title=Concat(F('tittle'),Value('爆款')))

Q功能:能改變多個查詢條件的關系,與或非

# Q 查詢# 1.查詢賣出數大于100 或者價格小于600的書籍res= models.Books.objects.filter(maichu__gt=100,price__lt=600)
#錯誤,filter內是and關系from django.db.models import Qres= models.Books.objects.filter(Q(maichu__gt=100),Q(price__lt=600)) #還是and關系res= models.Books.objects.filter(Q(maichu__gt=100)|Q(price__lt=600)) #Q可以用 |res= models.Books.objects.filter(~Q(maichu__gt=100)|Q(price__lt=600)) #前面取反# Q高階用法 能夠將查詢條件左邊變成字符串形式q=Q()
q.connector='or' #**修改關系
q.children.append('maichu__gt',180)
q.children.append('price__lt',600)res= models.Books.objects.filter(q) #filter 也支持直接放q對象,默認還是and關系

?

開啟事務

事務ACID

事務回滾

事務確認

?

from django.db import transactiontry:with transaction.atomic():  #開始事務操作# 先創建一個出版社new_publisher = models.Publisher.objects.create(name="火星出版社")# 創建一本書models.Book.objects.create(title="橘子物語",price=11.11,kucun=10,maichu=10,publisher_id=1000  # 指定一個不存在的出版社id)except Exception as e:print(str(e))

?

orm中常用字段及參數

AutoField
int自增列,必須填入參數 primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列。CharField  (sql:varchar)
字符類型,必須提供max_length參數, max_length表示字符長度。#****所有字段都有verbose_name 字段注釋*****IntegerField
一個整數類型,范圍在 -2147483648 to 2147483647。BigIntegerFieldDecimalField(Field)- 10進制小數- 參數:max_digits,小數總長度decimal_places,小數位長度EmailField(CharField):  varchar(254)- 字符串類型,Django Admin以及ModelForm中提供驗證機制DateField
日期字段,日期格式  YYYY-MM-DD,相當于Python中的datetime.date()實例。DateTimeField
日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當于Python中的datetime.datetime()實例。auto_now:每次操作數據的時候,該字段會自動將當前時間更新auto_now_add:創建數據的時候會自動將當前時間記錄下來,之后只要不是人為修改,那么一直不變BooleanField(Field)- 布爾值類型數據庫存0、1TextField(Field)- 文本類型沒有字數限制FileField(Field) -字符- 字符串,路徑保存在數據庫,文件上傳到指定目錄- 參數:upload_to = ""      上傳文件的保存路徑storage = None      存儲組件,默django.core.files.storage.FileSystemStorage例如:upload_to = "/data" 會自動將文件保存/data目錄下,然后將文件路徑保存到數據庫        ###外鍵字段
#django版本不同,級聯可能需要手動設置

自定義字段

首先參考常用的字段

                
# 自定義char類型class MyCharField(models.Field):"""自定義的char類型的字段類"""def __init__(self, max_length, *args, **kwargs): # max_length指定字符串寬度self.max_length = max_lengthsuper(MyCharField, self).__init__(max_length=max_length, *args, **kwargs)def db_type(self, connection):"""限定生成數據庫表的字段類型為char,長度為max_length指定的值"""return 'char(%s)' % self.max_length  # 返回 'char(32)' 在數據庫中就是char類型寬度32  # char類型字段的使用       class Class(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=25)# 使用自定義的char類型的字段cname = MyCharField(max_length=25)

?

數據庫查詢優化

ORM語句的特點

惰性查詢:只寫orm語句,沒有使用,orm不會查詢數據庫。

?

defer 和 only

res=models.Book.objects.all()
print(res) # 要用數據庫才查找數據庫#獲取書籍表中所有的書的名字
res=models.Book.objects.values('title')##only
#獲取對象,只有title,沒有其他字段。
res=models.Book.objects.only('title')for i in res:print(i.title) #only 括號內的字段,不會走數據庫print(i.price) #only 括號外的字段,重新走數據庫 all()不需要走數據庫#defer
res=models.Book.objects.defer('title')
for i in res:print(i.price)  #defer與only 剛好相反。括號內走數據庫,括號外不需要找數據庫。

?

select_related 與prefetch_related

與跨表操作有關

res=models.Book.objects.all()
for i in res:print(i.publish.name) #每循環一次就走一次數據庫res=models.Book.objects.select_related('publish') #inner join
#select_related內部直接將book與pulish連接起來,然后一次性將大表里的所有數據
#全部封裝給查詢出來的對象
# 這時候無論.book表數據還是publish數據都無需要走數據查詢# select_related括號內只能放外鍵字段 一對多,一對一
#多對多不行for i in res:print(i.publish.name)#連多表select_related('a__b__c')###prefetch_relatedres=models.Book.objects.prefetch_related('publish')# prefetch_related 實際是子查詢
# 子查詢的結果分裝到對象中
# 用戶感覺不出多一個命令for i in res:print(i.publish.name)#聯表查詢,遇到大表,效率就慢。

?

?

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記事本狀態欄不會自動_如何在記事本中同時啟用狀態欄和自動換行

記事本狀態欄不會自動The status bar in Windows’ Notepad displays the current line number and column number of the cursor location. However, if you find that the Status Bar option on the View menu is grayed out, it may be because you have Word Wrap enabled…

洛谷P2587 [ZJOI2008] 泡泡堂

題目傳送門 分析:一道策略游戲題,要求最大期望得分和最小期望得分。首先分析最大,很顯然是可以用一種類似于田忌賽馬的思維來做,將兩隊的實力按照從大到小(其實從小到大也可以)排序,然后就按照順…

極端高溫導致澳大利亞斷網

西澳大利亞首府珀斯因惡劣天氣出現了網絡連接問題, 網絡故障不是由于暴風雨或閃電引起的,而是極端高溫。本周一是珀斯有記錄以來第六熱的天,當天最高溫度達到了44.4℃。因為創紀錄的高溫,澳大利亞寬帶 服務商iiNet在當…

推薦一款采用 .NET 編寫的 反編譯到源碼工具 Reko

今天給大家介紹的是一款名叫Reko的開源反編譯工具,該工具采用C#開發,廣大研究人員可利用Reko來對機器碼進行反編譯處理。我們知道.NET 7 有了NativeAOT 的支持,采用NativeAOT 編譯的.NET程序 無法通過ILSpy 之類的傳統工具得到源碼&#xff0…

并行傳輸數據和串行傳輸數據_為什么串行數據傳輸比并行數據傳輸快?

并行傳輸數據和串行傳輸數據SATA hard drive connections are faster than older PATA hard drive connections and the same can be said for external cabling standards, but this is counter-intuitive: why wouldn’t the parallel transmission be faster? SATA硬盤驅動…

得到某月的天數

Calendar timeCalendar.getInstance(); time.clear(); time.set(Calendar.YEAR,2018);//year年 time.set(Calendar.MONTH,1);//Calendar對象默認一月為0,month月 int daytime.getActualMaximum(Calendar.DAY_OF_MONTH);//本月份的天數 System.out.pri…

Django09:圖書管理系統筆記/choices用法/ MTV與MVC模型/多對多三種創建方式

圖書管理系統筆記 redirect括號內可以直接寫url 也可以直接寫別名 但如果別名需要參數,必須使用reverse解析。 choices用法 使用場景:能列舉完全的數據 #使用方法:xxx_choice #1. get.xxx_display #2. 如果超出范圍,則顯示原…

業務處理速度變慢?且看IT如何成為救世主

在日常生活的方方面面,我們似乎都在期待著一種即時的便利。比如,用手機購物、訂餐、繳費、預約掛號等等。而在企業中,時間與效率可不是一種休閑福利,而是一項重要的商業功能。我們有理由期待,當今史無前例的數字革命正…

微軟讓卡塔爾世界杯踏入元宇宙

遵守前一篇公眾號文章里的承諾,昨天盆盆在視頻號里錄制了一段5分鐘左右的短視頻,講了江森自控和微軟Azure,如何幫助卡塔爾世界杯打造基于元宇宙的數字體育館。Part.1歡迎掃碼關注我的視頻號(每天更新元宇宙、云計算和數字化的短視頻)。Part.2…

洛谷——P1305 新二叉樹(新建二叉樹以及遍歷)

題目描述輸入一串二叉樹,用遍歷前序打出。 輸入輸出格式輸入格式: 第一行為二叉樹的節點數n。(n \leq 26n≤26) 后面n行,每一個字母為節點,后兩個字母分別為其左右兒子。 空節點用*表示 輸出格式: 前序排列的二叉樹 輸…

插槽1單通道插槽2雙通道_相機雙存儲卡插槽有什么大不了的?

插槽1單通道插槽2雙通道If you paid any attention to the launch of Canon and Nikon’s first full frame mirrorless cameras—the EOS R, Z6, and Z7— you’d have noticed that some people were pretty unhappy that they only came with a single card slot—an SD slo…

python 垃圾回收詳解

原文:https://zhuanlan.zhihu.com/p/31150408 總綱策略和垃圾回收系統工作內容引用計數詳解標記-清除分代收集循環引用編程應用-常見方法ex 過程詳解使用建議觸發機制參考文獻Python垃圾回收機制--完美講解(Python vs Ruby)Python垃圾回收機制…

Django10:Ajax介紹/發送數據/SweetAlert

Ajax 異步提交 局部刷新 發送方式 1. 瀏覽器輸入url,按enter get 2.a標簽href屬性 get 3.form表單 get/post 4. ajax get/post ajax 不是編程語言&#xf…

物聯網數據終端演進之道

智能手機的普及在最近幾年掀起了一股取代企業數據終端的風潮,但正如筆者在一年前便提到過 的,“智能手機難以在企業級應用中得以普及”,這種觀點最好的佐證便是時至今日,由于安全性與管理合規的需要,個人計算機用于企業…

mac 不能連接wi-fi_如何阻止Mac自動連接到Wi-Fi網絡

mac 不能連接wi-fiYour Mac automatically reconnects to Wi-Fi networks you’ve previously connected to. Starting with macOS High Sierra, you can now tell your Mac not to automatically connect to certain Wi-FI networks. Your Mac will remember the Wi-Fi networ…

“玩轉課堂”基本構想

1、項目背景隨著互聯網科技的高速發展,人們的生活、學習和工作中的許多事情都可以借助互聯網來完成,并且反響良好。作為學生,我們切身體會到,能夠使用網絡平臺來進行學習可以節約時間、并且十分方便;而在老師的角度&am…

SQLServer之分離數據庫

分離數據庫注意事項 要求具有 db_owner 固定數據庫角色中的成員資格。 可以分離數據庫的數據和事務日志文件,然后將它們重新附加到同一或其他 SQL Server實例。 如果要將數據庫更改到同一計算機的不同 SQL Server 實例或要移動數據庫,分離和附加數據庫會…

django11:自動序列化/批量插入數據/分頁器

自動序列化 借助serializers幫你自動完成序列化 from app01 import models from django.core import serializers def ab_se(request):user_queryset models.Userinfo.objects.all()#原始方法user_list []for user_obj in user_queryset:user_list.append({username:user_o…

羅漢塔最少步驟_如何以最少的步驟壓縮和密碼保護文件?

羅漢塔最少步驟If you have a large batch of files to compress and you want to add password protection to each of them, what is the simplest or quickest way to do so? Today’s SuperUser Q&A post has the answer to a curious reader’s question. 如果要壓縮…

IoTSharp中使用X509加密MQTT通訊并實現設備鑒權

IoTSharp支持MQTT協議通過 TLS 1.2 加密通訊, 并可以通過X509證書進行設備認證登錄。基本配置在 appsettings.Production.json中需要 指定域名, 并設置EnableTls為true"MqttBroker":{"DomainName":"http://demo.iotsharp.net:2…