DJango視圖查詢,F,Q對象,聚合函數

查詢

(文章末尾附上了該視圖views.py對應的模型類models.py內容)
查詢集

1.查詢集表示從數據庫中獲取的對象集合
2.查詢集可以含有零個、一個或多個過濾器
3.過濾器基於所給的參數限制查詢的結果
4.在管理器上調用過濾器方法會返回查詢集
5.查詢集經過過濾器篩選後返回新的查詢集,因此可以寫成鏈式過濾
6.惰性執行:創建查詢集不會帶來任何數據庫的訪問,直到調用數據時,纔會訪問數據庫
7.何時對查詢集求值:迭代,序列化,與if合用
8.返回查詢集的方法,稱爲過濾器
    all()       
    filter()
    exclude()
    order_by()
    values()
9.過濾器書寫格式:
    filter(鍵1=值1,鍵2=值2) 等價於下面
    filter(鍵1=值1).filter(鍵2=值2)
    高級使用方法見下面比較運算符
10.查詢集返回的是一個類列表,可以使用下標可以獲取對應的對象,也支持切片,但不支持負下標

查詢返回單個值
get():返回單個滿足條件的對象
    如果未找到會引發"模型類.DoesNotExist"異常
    如果多條被返回,會引發"模型類.Multiple    ObjectsReturned"異常
count():返回當前查詢的總條數
first():返回第一個對象
last():返回最後一個對象
exists():判斷查詢集中是否有數據,如果有則返回True

比較運算符

配合過濾器filter()、exclude()、get()使用
    格式:屬性名稱__比較運算符=值
exact:表示判斷是否等於
contains:包含
startswith,endswith:以value開頭或結尾
上面的參數默認是大小寫敏感的,在前面加個i可以忽略大小寫如:iexact,icontains、istarswith、iendswith

isnull、isnotnull:是否爲null
in:是否包含在範圍內
in:是否包含在範圍內
year、month、day、week_day、hour、minute、second:對日期間類型的屬性進行運算

代碼示例

    # 查詢英雄表中,hcontext字段中包含‘九’的所有信息
    # list_info = HeroInfo.objects.filter(hcontent__contains='九')

    # 查詢英雄表中,沒有被邏輯刪除的所有數據,filter:過濾
    # list_info = HeroInfo.objects.filter(isDelete=False)
    # 列表list_info包含的數據個數
    # count = list_info.count()

    # 排除名字以 ‘風’ 結尾的,exclude:排除
    # list_info = HeroInfo.objects.exclude(hname__endswith='風')

    # 名字不是空的
    # list_info = HeroInfo.objects.filter(hname__isnull=False)

    # gt、gte、lt、lte:大於、大於等於、小於、小於等於;
    # in: 是否包含在in的範圍內,主鍵寫id或者pk都可以
    # list_info = BookInfo.books.filter(id__in=[1,2])
    # list_info = HeroInfo.objects.filter(pk__in=[18,19,20])

    # 跨關聯查詢,查詢書中的英雄的內容中包含‘九’的書。
    list_info = BookInfo.books.filter(heroinfo__hcontent__contains='九')

    context = {'list':list_info}
    return render(request, 'booktest/index.html', context)

聚合函數

使用aggregate()函數返回聚合函數的值
聚合函數:Avg,Count,Max,Min,Sum
聚合函數在查詢集的最後面寫,Count不用aggregate()返回值,可以直接調用

list_info = HeroInfo.objects.exclude(hname__endswith='風')
max = list_info.aggregate(Max(pk))
count = list_info.count()

F 對象

用來比較一個字段和另一個字段的值,即一個對象的一個屬性和另一個屬性的值.

# books是BookInfo的類屬性保存的自定義的一個管理類的對象.
# 查詢閱讀量大於評論量的對象
result = BookInfo.books.filter(bread__gt=F('bcommet'))

Q 對象,

過濾器的方法中關鍵字參數查詢,可以實現多個條件的邏輯或

或查詢
BookInfo.books.filter(Q(判斷一) | Q(判斷2))
與查詢
result = BookInfo.books.filter(pk__lt=5,(bcommet__lt=10)

模型類內容

# models.py
from django.db import models

class BookInfoManage(models.Manager):
    def get_queryset(self):
        return super(BookInfoManage,self).get_queryset().filter(isDelete=False)

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')
    bread = models.IntegerField(default=0)
    bcommet = models.IntegerField(default=0)
    isDelete = models.BooleanField(default=False)
    books = models.Manager()
    books2 = BookInfoManage()
    class Meta():
        db_table = 'bookinfo'

    def __str__(self):
        return self.btitle.encode('utf-8')

class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)
    hgender = models.BooleanField(default=True)
    hbook = models.ForeignKey('BookInfo')
    hcontent = models.CharField(max_length=100)
    isDelete = models.BooleanField(default=False)

    def __str__(self):
        return self.hname.encode('utf-8')
發佈了44 篇原創文章 · 獲贊 107 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章