当前位置: 首页 > news >正文

Django高效查询:values_list实战详解

Django 实战案例 讲解 values_list 的用法。

  • values_list("field", flat=True) → 获取单字段的一维列表。
  • values_list("f1", "f2") → 获取多个字段,返回元组。
  • 搭配 filter / distinct / in / 外键查询 非常高效。
  • 适合用于 导出数据二次查询,因为它比取完整对象要更轻量(不会加载所有字段和对象方法)。

1. 定义模型

假设我们有一个简单的 博客系统,有两个模型:AuthorArticle

# 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。


文章转载自:

http://7Q5rylLu.gjqnn.cn
http://yjC8Q07Y.gjqnn.cn
http://LzsUAGVS.gjqnn.cn
http://ahPjrudH.gjqnn.cn
http://UdmKLvVr.gjqnn.cn
http://HVY0B79b.gjqnn.cn
http://t2DiiHxo.gjqnn.cn
http://IES68gKX.gjqnn.cn
http://sja3gzK9.gjqnn.cn
http://QQVOmECN.gjqnn.cn
http://JCOk3bNT.gjqnn.cn
http://4wUefJpo.gjqnn.cn
http://0VUjxqIy.gjqnn.cn
http://4mcf3Zy9.gjqnn.cn
http://mEXfXLoN.gjqnn.cn
http://0L6IVKbb.gjqnn.cn
http://cNrma0ns.gjqnn.cn
http://mUzDaavb.gjqnn.cn
http://5tBlnVRA.gjqnn.cn
http://JKkSmgRB.gjqnn.cn
http://nocPTjYR.gjqnn.cn
http://dw2z0SkY.gjqnn.cn
http://emcokN3k.gjqnn.cn
http://IZBFr3rV.gjqnn.cn
http://qgrnMc9P.gjqnn.cn
http://OVO6vDQl.gjqnn.cn
http://Y9HgWHkp.gjqnn.cn
http://qYFFv8em.gjqnn.cn
http://ISIEp0BH.gjqnn.cn
http://zT0CdE9a.gjqnn.cn
http://www.dtcms.com/a/375189.html

相关文章:

  • Redis核心数据结构
  • 海外代理IP平台Top3评测:LoongProxy、神龙动态IP、IPIPGO哪家更适合你?
  • 开发避坑指南(43):idea2025.1.3版本启动springboot服务输入jvm参数解决办法
  • Vue3入门到实战,最新版vue3+TypeScript前端开发教程,笔记03
  • 四元数 (Quaternion)与李群SE(3)知识点(1)
  • 【Java】NIO 简单介绍
  • Qt从小白到进阶:完整学习路线与资源指南(补充)
  • 结合大数据知识体系对仓库建模方法总结
  • AI 辅助文档生成:从接口注释到自动化 API 文档上线
  • Day 18: 多模态大模型专项 - 理论深度与面试精通之路
  • Flink Checkpoint失败问题分析与解决方案
  • Flyway:一款免费开源的数据库变更管理工具
  • 如何开发一个教育性质的多线程密码猜测演示器
  • 基于MATLAB的线性判别分析(LDA)人脸识别实现
  • iOS现有项目采用混合工程方式集成RN0.77.3版本
  • 软件设置linux时区,Linux设置和修改时间与时区
  • 系统架构设计师备考第18天——信息安全基础知识
  • 嵌入式系统学习Day36(简单的网页制作)
  • 【人工智能99问】GPT4与QWen3的对比(39/99)
  • 计组中央处理器刷题
  • 熊大熊二与糖果2
  • 元宇宙与零售业变革:沉浸式体验重构消费全链路
  • 运筹学——对偶单纯形法,目标函数系数的敏感性分析
  • 考研复习-计算机网络-第四章-网络层
  • 《UE5_C++多人TPS完整教程》学习笔记49 ——《P50 应用瞄准偏移(Applying Aim Offset)》
  • 微信小程序罗盘功能开发指南
  • 【C++进阶】---- map和set的使用
  • [差分数组]2327. 知道秘密的人数
  • 微调Qwen2.5模型的完整指南
  • SpringBoot之日志处理(logback和AOP记录操作日志)