Django 實戰案例 講解 values_list
的用法。
values_list("field", flat=True)
→ 獲取單字段的一維列表。values_list("f1", "f2")
→ 獲取多個字段,返回元組。- 搭配
filter
/distinct
/in
/ 外鍵查詢 非常高效。 - 適合用于 導出數據 或 二次查詢,因為它比取完整對象要更輕量(不會加載所有字段和對象方法)。
1. 定義模型
假設我們有一個簡單的 博客系統,有兩個模型:Author
和 Article
。
# blog/models.py
from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=50)email = models.EmailField(unique=True)def __str__(self):return self.nameclass Article(models.Model):title = models.CharField(max_length=100)content = models.TextField()author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="articles")created_at = models.DateTimeField(auto_now_add=True)def __str__(self):return self.title
2. 插入一些測試數據
# 創建作者
a1 = Author.objects.create(name="Alice", email="alice@example.com")
a2 = Author.objects.create(name="Bob", email="bob@example.com")# 創建文章
Article.objects.create(title="Django ORM 入門", content="....", author=a1)
Article.objects.create(title="Django QuerySet 高級用法", content="....", author=a1)
Article.objects.create(title="數據庫優化技巧", content="....", author=a2)
3. values_list
基本用法
3.1 獲取某個字段的列表
# 獲取所有文章的標題列表
titles = Article.objects.values_list("title", flat=True)
print(list(titles))
# 結果: ['Django ORM 入門', 'Django QuerySet 高級用法', '數據庫優化技巧']
👉 flat=True
表示返回單個字段時,結果是一個一維列表,而不是元組。
3.2 獲取多個字段
# 獲取文章標題和作者 ID
articles = Article.objects.values_list("title", "author_id")
print(list(articles))
# 結果: [('Django ORM 入門', 1), ('Django QuerySet 高級用法', 1), ('數據庫優化技巧', 2)]
👉 當有多個字段時,結果是一個元組列表。
3.3 搭配 distinct
去重
# 獲取所有作者 ID,去重
authors = Article.objects.values_list("author_id", flat=True).distinct()
print(list(authors))
# 結果: [1, 2]
3.4 搭配 filter
使用
# 獲取 Alice 寫的文章標題
alice_titles = Article.objects.filter(author__name="Alice").values_list("title", flat=True)
print(list(alice_titles))
# 結果: ['Django ORM 入門', 'Django QuerySet 高級用法']
3.5 用于外鍵關聯
# 獲取所有文章的標題和作者名字
articles = Article.objects.values_list("title", "author__name")
print(list(articles))
# 結果: [('Django ORM 入門', 'Alice'), ('Django QuerySet 高級用法', 'Alice'), ('數據庫優化技巧', 'Bob')]
👉 注意這里 author__name
直接取了外鍵對象的字段。
4. 實際應用場景
4.1 批量取 ID 用于二次查詢
# 獲取 Alice 的文章 ID 列表
article_ids = Article.objects.filter(author__name="Alice").values_list("id", flat=True)# 用這些 ID 去做其他操作,比如批量刪除
Article.objects.filter(id__in=article_ids).delete()
4.2 導出數據(比直接取對象更高效)
# 導出文章標題和作者郵箱,直接生成 CSV
rows = Article.objects.values_list("title", "author__email")import csv
with open("articles.csv", "w", newline="") as f:writer = csv.writer(f)writer.writerow(["標題", "作者郵箱"])writer.writerows(rows)
👉 values_list
會直接返回元組,正好適合寫入 CSV/Excel。