一、基礎用法
values_list()方法是Django ORM中常用的方法之一,可以返回一個包含指定字段的QuerySet序列。其用法如下:
Author.objects.values_list('name', 'email')
其中’Author’是模型名,’name’和’email’是對應模型名中的字段名。該語句返回一個QuerySet,其中每一個元素為一個元組,元組中的元素按照傳入values_list()方法中的參數順序排列。
例如,如果模型名為’Author’,若該模型中有兩條數據分別如下:
Author.objects.create(name='Tony', email='tony@example.com')
Author.objects.create(name='Lucy', email='lucy@example.com')
運行以下代碼:
authors = Author.objects.values_list('name', 'email')
print(authors)
則輸出的結果如下:
[(u'Tony', u'tony@example.com'), (u'Lucy', u'lucy@example.com')]
我們可以看到,結果是一個由元組組成的列表,每個元組包含一個作者的姓名和郵箱。
二、distinct用法
類似於SQL語句中的DISTINCT關鍵字,在django ORM中可以用distinct()方法去除重複的QuerySet。具體方法如下:
Author.objects.values_list('name', flat=True).distinct()
其中flat=True將結果平鋪成一個單個的列表。
三、order_by用法
除了DISTINCT外,ORM中的ORDER BY也是一個基礎且重要的操作。在Django的values_list()方法中,我們也可以使用order_by()方法進行排序。使用方法如下:
Author.objects.values_list('name', flat=True).order_by('-id')
在例子中,flat=True表示將結果平鋪成單個列表,order_by(‘-id’)表示按照id字段的降序排列。同樣也可以使用多個排序條件,例如:
Author.objects.values_list('name', 'email').order_by('name', 'email')
則該語句中,按照姓名升序排列,姓名相同時按照郵箱升序排列。
四、values_list與annotate的聯合使用
除了以上介紹的基本用法,values_list()方法還可以和annotate()方法一起使用。annotate()方法可以對QuerySet進行聚合操作。例如,在’Author’模型中數據如下:
Author.objects.create(name='Tony', email='tony@example.com', age=23)
Author.objects.create(name='Lucy', email='lucy@example.com', age=23)
如果需要計算每個年齡的人數,可以使用以下語句:
Author.objects.values_list('age').annotate(Count('age'))
該語句返回計算後的結果,每個元素為一個元組,其中第一個元素為age值,第二個元素為該age值出現的次數。若輸出結果,則會得到如下結果:
[(23, 2)]
五、values_list與related_name的聯合使用
在Django中,related_name為ForeignKey和ManyToManyField中的屬性之一,它用於指定反向查詢的名稱,即反向查詢的模型名。我們可以使用related_name屬性在關聯模型中定義反向關係,然後使用values_list()方法和它結合使用。
例如,在模型中有如下定義:
class Author(models.Model):
name = models.CharField(max_length=50)
class Book(models.Model):
author = models.ForeignKey(Author, related_name='books')
title = models.CharField(max_length=100)
定義了一個Author和Book的一對多關係,related_name=’books’指定了反向關係的名稱為’books’。
如果想要查詢所有作者的所有書籍信息,可以使用以下代碼:
Author.objects.values_list('name', 'books__title')
其中books__title是反向關係的名稱和Book模型中的title相連接的結果。以上語句返回每個作者名字和他們所寫的書籍的名稱。用以下代碼輸出結果:
for item in result:
print(item[0], item[1])
則得到如下結果:
('Tony', 'Python for Beginners')
('Lucy', 'C++ Primer Plus')
六、總結
values_list()是Django ORM中常用的方法之一,可以返回一個包含指定字段的QuerySet序列,DISTINCT和ORDER BY等操作也適用。當然,它還可以和annotate()方法和related_name屬性進行聯合使用,進行更多的操作。
值得注意的是,在使用values_list()方法時,不能直接對返回的QuerySet進行修改,因為它是一個只讀列表。
原創文章,作者:URUJG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/325445.html