查詢
(文章末尾附上了該視圖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')