數據庫裏的數據要展示出來,查詢篩選必不可少。複雜一點的可能會讓剛接觸的人抓狂。
官方文檔:https://docs.djangoproject.com/zh-hans/2.1/ref/models/querysets
入門級-filter:
Friend.objects.filter(gender="female",height__gt=165,name__contains="芳",age__in=[25,28,36],span__range=(1,3)).order_by("-height")
與的關係,查找性別女且身高大於165且名字中包含芳且年齡在[25,28,36]中且認識年限在[1,3)之間的所有人並按身高降序排序。
其餘的還有iexact、istartswith、endswith等等。i表示case insensitive。
進階
1、Q、F
filter只能表示與的關係,如果要表示或、非,此時需要用到Q表達式(對象)。
Friend.objects.filter( ~Q(name="xx") | Q(height__lt=160) )
如果查詢同一個實例多個參數之間的關係,需要用到F表達式(對象)。
查詢某個月薪大於年齡的同事。
Fellow.objects.filter(salary__gt=F("age"))
2、Union、intersection、difference
多個查詢集的並、交、差。
A.union(B) = , A.intersection(b)=,A.defference(B)=
均可帶多個參數,即A.difference(B,C,D)
3、aggregate、annotate
聚合與註解。
聚合是一組方便的數據統計工具,比如求均值、方差、標準差、最大、最小等。
註解是給實例添加一個新的屬性,新增的屬性往往來自於聚合,當然也可以是手動添加的屬性。
4、執行sql語句
前面的所有方法均無法滿足複雜的需求時,那就直接上sql語句吧。
2個層次,只查當前model對應的表,查整個數據庫。
- 表級
Student.objects.raw("select * from myapp_student where score>90")
- 數據庫級
with connection.cursor() as cursor:
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
row = cursor.fetchone()
不要用字符串格式化"name={}".format(someone)之類的,會有sql注入的風險。用django自帶的參數傳遞機制。
參考此鏈接
https://docs.djangoproject.com/zh-hans/2.1/topics/db/sql/