標籤:mod 均值 條件 queryset 預設 包含 實現 出版社 upd
ORM查詢之
基於對象
的正向查詢與反向查詢
對象形式的查詢
# 正向查詢
ret1=models.Book.objects.first() print(ret1.title) print(ret1.price) print(ret1.publisher) print(ret1.publisher.name) # ret1.publisher是book屬性,是Publish對象,非queryset集合
# 反向尋找
ret2=models.Publish.objects.last() print(ret2.name) print(ret2.city)
#如何拿到與它綁定的Book對象呢?
print(ret2.book_set.all()) # ret2.book_set是一個queryset集合,all()可以省略 print(ret2.book_set.all().values(‘title‘).distinct()) # 去重
ORM查詢之
基於條件
的正向查詢與反向查詢
單表條件查詢[雙底線實現表關聯]:使用逗號分隔可以實現and的條件查詢
# models.Book.objects.filter(id__lt=10, id__gt=1) # 擷取id大於1 且 小於10的值# models.Book.objects.filter(id__in=[11, 22, 33]) # 擷取id等於11、22、33的資料# models.Book.objects.exclude(id__notin=[11, 22, 33]) # not in# models.Book.objects.filter(title__contains="Python") # 模糊比對# models.Book.objects.filter(name__icontains="ven") # icontains大小寫不敏感# models.Book.objects.filter(id__range=[1,12]) # 範圍bettwen and# startswith,istartswith, endswith, iendswith, # 以XXX開始/XXX結束
多表條件關聯查詢[雙底線實現表關聯]
一對多[正向查詢]: 使用逗號分隔可以實現and的條件查詢,filter和values裡面均可使用雙底線
# models.Book.objects.filter(title=‘Python‘,id=5).values(‘publish__name‘).distinct() # [{‘publisher__city‘: ‘北京‘}] publish__name這裡的Book裡面的publish屬性# models.Book.objects.filter(publish__id=5).values(‘title‘).distinct() # Book尋找出版社ID=5的書的名字# models.Book.objects.filter(publish__id=5).values(‘publish_name‘).distinct() # Book尋找出版社ID=5的出版社的名字
一對多[反向查詢]:使用逗號分隔可以實現and的條件查詢,filter和values裡面均可使用雙底線
# models.Publish.objects.filter(book__title=‘Python‘,book_id=5).values(‘name‘) .distinct() # [{‘name‘: ‘H出版社‘}] 尋找跟Publish相關的Book的內容,book__title中的book就是Publish的關聯表名
多對多[正向查詢]:使用逗號分隔可以實現and的條件查詢
# models.Book.objects.filter(title=‘Python‘).values(‘author__name ‘) .distinct() # models.Book.objects.filter(author__name=‘FTL‘).values(‘title‘) .distinct()
多對多[反向查詢]:使用逗號分隔可以實現and的條件查詢
# models.Author.objects.filter(book__title=‘Python‘).values(‘name‘) .distinct()
注意:
1、正向尋找的book__title中的book是表名Book
2、正向尋找的publish__city或者author__name中的publish,author是book表中綁定的欄位【Book裡面的屬性】
3、一對多和多對多在這裡用法沒區別
ORM之彙總查詢與分組查詢
ORM之彙總查詢與分組查詢
彙總查詢: aggregate(*args,**kwargs): 可通過filter/Values過濾後彙總
通過對QuerySet進行計算,返回一個彙總值的字典。aggregate()中每一個參數都指定一個包含在字典中的傳回值[鍵的名稱是彙總值的標識符,值是計算出來的彙總值。鍵的名稱是按照欄位和彙總函式的名稱自動產生出來的],即在查詢集上產生彙總。
from django.db.models import Avg,Min,Sum,Max>>> Book.objects.all().aggregate(Avg(‘price‘)){‘price__avg‘: 34.35} # 系統定義名稱>>> Book.objects.all().aggregate (average_price=Avg(‘price‘)){‘average_price‘: 34.35} # 自訂了名稱>>> Book.objects.aggregate(Avg(‘price‘), Max(‘price‘), Min(‘price‘)) # 其他查詢
分組查詢: annotate(*args,**kwargs): 可通過filter/Values過濾後分組
可以通過計算查詢結果中每一個對象所關聯的對象集合,從而得出總計值(也可以是平均值或總和),即為查詢集的每一項產生彙總。
from django.db.models import Avg,Min,Sum,Max>>> Book.objects.values(‘author_name‘).annotate(Sum(‘price‘)) # 根據作者名分組後計算每個作者price
ORM之 F查詢與Q查詢
F查詢: 只能適用於IntegerFiled 【使用了F查詢,預設值是0】
from django.db.models import Fmodels.Book.objects.update(num=F(‘num‘) + 100)
Q查詢:
from django.db.models import Q#1 Q對象(django.db.models.Q)可以對關鍵字參數進行封裝,從而更好地應用多個查詢 q1=models.Book.objects.filter(Q(title__startswith=‘P‘)).all()# 2、可以組合使用&,|操作符,當一個操作符是用於兩個Q的對象,它產生一個新的Q對象。 q2=models.Book.objects.filter(Q(name=‘HHH‘)|Q(name=‘FTL‘)).all() # 3、Q對象可以用~操作符放在前面表示否定,也可允許否定與不否定形式的組合 Q(title__startswith=‘P‘) | ~Q(pub_date__year=2005)# 4、應用: Book.objects.get( Q(title__startswith=‘P‘) and (Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))) )# 5、Q對象可以與關鍵字參數查詢一起使用,不過一定要把Q對象放在關鍵字參數查詢的前面。 # 正確: Book.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)), title__startswith=‘P‘) # 錯誤: Book.objects.get( question__startswith=‘P‘, Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
Python學習---ORM查詢之基於對象的正向/反向查詢