81.常用的返回QuerySet對象的方法使用詳解:values和values_list


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()中只傳遞一個字段的情況下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM