python_django_models模塊中的查詢

查詢集:表示從數據庫獲取的對象集合,查詢集能夠有多個過濾器,過濾器就是一個函數(方法),基於所給參數限制查詢集結果
從sql角度來講,查詢集和select等價,過濾器和where等價sql

查詢集特色:數據庫

  惰性執行:建立查詢集不會帶來任何的數據訪問,直到調用數據(要用滴時候)時,纔會訪問數據django

  直接訪問數據的狀況(直接向數據庫拿):迭代/序列化/與if合用緩存

返回查詢集的方法稱爲過濾器函數

過濾器方法:spa

  返回一堆數據的過濾器:code

all() 返回查詢集中全部的對象(有啥返回啥)
filter()

返回符合條件的數據值對象

格式:.filter(鍵=值)blog

     .filter(鍵=值,鍵=值)排序

     .filter(鍵=值).filter(鍵=值)

exclude() 過濾掉符合條件的數據值
order_by() 排序
values() 返回查詢集中具體的數據值(一個列表,其中一條數據就是一個對象)

  返回單個數據的過濾器:

get()

返回一個知足條件的對象

注:若沒有找到符合條件的對象,會引起模型類DoesNotExist異常

  若找到多個對象,會引起模型類MultipleObjectReturned異常

count()  返回當前查詢集的對象個數
first()  返回查詢集的第一個對象
last()  返回查詢集的最後一個對象
exists()  判斷查詢集中是否有數據,如有數據返回True

限制查詢集:查詢集返回列表,能夠使用下標的方法進行限制,等同於sql中的limit語句
注:下標不能是負數
舉個栗子:

  顯示前5條:studentList=Students.stuObj1.all()[0:5]
  分頁顯示:studentList=Students.stuObj1.all()[(page-1)*5:page*5]

查詢集的緩存:每一個查詢集都包含一個緩存來最小化的對數據庫進行訪問

  在新建的查詢集中,緩存首次爲空,第一次對查詢集求值,會發生數據緩存,
  django會將查詢出來的數據作一個緩存,並返回查詢結構,之後的查詢直接使用查詢集的緩存

 

字段查詢:
概述:實現類sql中where語句,做爲方法filter(),exclude(),get()的參數
語法:屬性名稱__比較運算符 = 值
外鍵:屬性名_id

比較運算符:

exact exact:判斷(大小寫敏感,在前面加上i, iexact就表示不區分大小寫)
contains 是否包含(大小寫敏感,在前面加上i,icontains就表示不區分大小寫)(例:studentsList = Students.stuObj1.filter(name__icontains="ni"))
startswith/endswith 以value開頭或結尾(大小寫敏感,在前面加上i,istartswith/iendswith就表示不區分大小寫)(例:.filter(name__istartswith="ni"))
isnull/isnotnull 是否爲空(例:.filter(name__isnull=True))
in in:是否包含在範圍內(例:.filter(pk__in=[2,3,4,6,8]))    (【pk】主鍵)
gt/gte/lt/lte 大於/大於等於/小於/小於等於(例:.filter(age__gt=30))
year/month/day/week_day/hour/minute/second 匹配年/月/日....(例:.filter(lastTime__year=2017))

跨關聯查詢:

    處理join查詢(鏈接查詢)

    語法:模型類名__屬性名__(比較運算符)

舉個栗子:

 grade = Grades.objects.filter(students__contend__contains='nili')  # 模型類名__屬性名__比較運算符
# 帶有‘nili’這幾個字母的數據是屬於哪一個班級的 print(grade)

查詢快捷:

    pk(主鍵)

聚合函數:使用aggregate()函數返回聚合函數的值

Avg 平均值
Count 計數
Max 最大值
Min 最小值
Sum 求和

舉個栗子:

from django.db.models import Max
def studentsearch(request):
  maxAge = Students.stuObj1.aggregate(Max('age'))
  print(maxAge)

F對象:
 能夠使用模型的A屬性與B屬性進行比較,且支持F對象的算術運算

舉個栗子:

from django.db.models import F

def grades(request):
  g = Grades.objects.filter(girl_num__gt=('boy_num')+20)
  print(g)
  return HttpResponse('....')

Q對象:
過濾器的方法中的關鍵字參數,進行or查詢就能夠使用Q對象

舉個栗子:

from django.db.models import F,Q

def studentss(request):
  studentsList = Students.stuObj1.filter(Q(pk__lte=3)|Q(age__gt=50)) # 或 pk(主鍵)
  studentsList = Students.stuObj1.filter(Q(pk__lte=3)) # 只用於匹配
  studentsList = Students.stuObj1.filter(~Q(pk__lte=3)) # 取反
相關文章
相關標籤/搜索