django全棧(六):QuerySet概要

數據庫裏的數據要展示出來,查詢篩選必不可少。複雜一點的可能會讓剛接觸的人抓狂。

官方文檔: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 \cup B,    A.intersection(b)=A\cap B,A.defference(B)=A-A\cap 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/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章