values: 指定提取的數據庫表中的字段值,如果不指定任何的字段名的話,默認情況下會提取所有的字段值。但是需要注意的是使用values返回的QuerySet對象中包括的是一個個的字典。
1.提取與Article形成映射關系的表article中的屬性的所有值。示例代碼如下:
def index7(request):
articles = Article.objects.values('title', 'content')
print(type(articles))
for article in articles:
print(article)
print(type(article))
return HttpResponse("success!")
輸出結果如下:
<class 'django.db.models.query.QuerySet'>
{'title': 'Hello', 'content': '你好'}
<class 'dict'>
{'title': 'Hello World', 'content': '大家好'}
<class 'dict'>
{'title': '鋼鐵是怎樣煉成的', 'content': '你好\r\n'}
<class 'dict'>
{'title': '中國吸引力', 'content': '精彩極了\r\n'}
<class 'dict'>
2. 提取與Article模型相關聯的模型Category上的屬性name的所有值。示例代碼如下:
from django.http import HttpResponse
from .models import Article, Category
def index7(request):
articles = Article.objects.values('title','category__name')
# 打印出articles的數據類型
print(type(articles))
for article in articles:
print(article)
# 遍歷QuerySet中的每一篇文章,並且打印出其數據類型:字典類型
print(type(article))
return HttpResponse('success')
輸出打印結果:
<class 'django.db.models.query.QuerySet'>
{'title': 'Hello', 'category__name': '最新文章\r\n'}
<class 'dict'>
{'title': '中國吸引力', 'category__name': '最新文章\r\n'}
<class 'dict'>
{'title': 'Hello World', 'category__name': '最熱文章'}
<class 'dict'>
{'title': '鋼鐵是怎樣煉成的', 'category__name': '高評分文章'}
<class 'dict'>
3. 如果想要為QuerySet中字典的鍵進行重新命名的話,就要使用到F表達式和關鍵字參數了,因為F表達式可以動態的獲取字段的值。示例代碼如下:
# 自定義的名字cate_name不能和Article模型上的屬性相同
articles = Article.objects.values('title', cate_name=F('category__name'))
查看返回的結果如下:
{'title': 'Hello', 'cate_name': '最新文章\r\n'}
<class 'dict'>
{'title': '中國吸引力', 'cate_name': '最新文章\r\n'}
<class 'dict'>
{'title': 'Hello World', 'cate_name': '最熱文章'}
<class 'dict'>
4. 在values()中也可以使用聚合函數形成一個新的字段,比如想要獲取每個文章的銷量。示例代碼如下:
from django.db import F, Q
# 獲取每篇文章的銷量(閱讀量)
articles = Article.objects.values('title', art_nums=Count('category__id'))
5. values_list():和values()用法相同,不同的地方就是,前者返回的是元組而后者返回的是字典。示例代碼如下:
articles = Article.objects.values_list('title', Count('category__id'))
6. values_list(): 如果只傳遞一個字段名,這個是后再返回一個元組的話,就不太好了,可以通過指定falt=True,來使元組扁平化,拆分元組。示例代碼如下:
articles = Article.objects.values_list('title', flat=True)
返回結果如下:
Hello
Hello World
鋼鐵是怎樣煉成的
中國吸引力
需要注意的是, flat參數只能要用在values_list()中只傳遞一個字段的情況下