Django中values_list的使用

一、基礎用法

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-hant/n/325445.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
URUJG的頭像URUJG
上一篇 2025-01-13 13:24
下一篇 2025-01-13 13:24

相關推薦

  • Django ORM如何實現或的條件查詢

    在我們使用Django進行數據庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Django項目中執行Python腳本

    本文將闡述在Django項目中如何執行Python腳本以及執行腳本的幾種方式。 一、subprocess模塊執行Python腳本 subprocess模塊提供了一個簡單的接口用於創…

    編程 2025-04-27
  • Python Django Channels用法介紹

    本文將從多個方面對Python Django Channels進行詳細的講解,包括介紹、使用、優缺點以及實際應用等,幫助大家更好地理解和應用Python Django Channe…

    編程 2025-04-25
  • Django教程:從入門到實戰

    Django是一個高級的Python Web框架,採用了MTV的設計模式。MTV表示Model-Template-View,是Django框架中的三個核心部分。 一、Django入…

    編程 2025-04-24
  • 啟動Django

    一、安裝Django 在啟動Django之前,我們需要首先安裝Django。Django的最新版本可以在官網上找到。 pip install Django 安裝完畢之後,我們就可以…

    編程 2025-04-24
  • Django運行命令詳解

    Django是一款基於Python語言的Web框架,擁有強大的ORM、模板渲染、會話管理等特性。在使用Django的過程中,熟悉常用的Django運行命令可以讓我們更加高效、便捷地…

    編程 2025-04-12
  • 使用django-ckeditor進行富文本編輯

    一、簡介 Django-CKEditor是一個免費和開源的項目,它提供了一個基於Web的富文本編輯器,可以方便地進行長文本的編輯。它是基於在CKEditor之上的Django的一個…

    編程 2025-04-12
  • Django多線程實現指南

    一、多線程介紹 多線程是指在一個程序中同時執行多個線程,實現並發處理的技術。在Django開發中,如果使用多線程可以大大提高程序處理效率,讓用戶得到更好的體驗。但是,多線程也帶來了…

    編程 2025-02-05
  • Django配置MySQL

    一、安裝Python和Django 首先,安裝Python和Django是配置MySQL的前提條件。可以在https://www.python.org/downloads/下載Py…

    編程 2025-02-05
  • 深入學習Django中的objects.filter

    一、objects.filter介紹 Django為我們提供了方便的數據庫查詢API,其中objects.filter是其中非常常用的一種方式。filter()方法可以幫助我們從數…

    編程 2025-02-05

發表回復

登錄後才能評論