Django ORM – 单表实例(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言:为什么选择Django ORM?
在开发Web应用时,数据库操作往往是开发者最头疼的环节之一。手动编写SQL语句不仅容易出错,还会增加代码的维护成本。Django ORM(对象关系映射)的出现,就像为开发者提供了一位“翻译官”——它将Python对象无缝映射到数据库表,让开发者可以用面向对象的方式操作数据,而无需直接接触复杂的SQL语句。
本文将通过一个具体的单表实例,深入讲解Django ORM的核心概念和操作方法。我们以“书籍管理”为案例场景,从模型定义、数据增删改查到复杂查询,逐步展开讲解。无论是编程新手还是有一定经验的开发者,都能通过本文掌握单表操作的核心技巧。
一、模型定义:构建数据表的“蓝图”
1.1 模型类与数据库表的关系
Django的模型(Model)是数据库表的抽象表示。每个模型类对应一张数据库表,类的属性对应表的字段。例如,定义一个“书籍”模型时,我们需要确定书名、作者、出版日期等字段。
代码示例:创建书籍模型
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
publish_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
is_available = models.BooleanField(default=True)
1.2 字段类型与参数详解
- CharField:存储字符串,需指定
max_length
参数(类似SQL中的VARCHAR) - DateField:存储日期,格式为
YYYY-MM-DD
- DecimalField:精确的小数类型,
max_digits
表示总位数,decimal_places
表示小数位数 - BooleanField:布尔类型,默认值可通过
default
参数设置
比喻:字段类型就像量杯
想象数据库字段是不同规格的量杯。CharField是固定容量的量杯,超过容量会溢出;DecimalField是精确到毫升的量杯,确保数值不丢失精度。
1.3 创建数据库表
定义模型后,需通过以下步骤生成迁移文件并创建表:
python manage.py makemigrations
python manage.py migrate
二、数据操作:CRUD的全流程实践
2.1 创建数据(Create)
通过模型类的objects.create()
方法快速插入数据:
book1 = Book(
title="Python编程从入门到实践",
author="Eric Matthes",
publish_date="2022-01-15",
price=79.90,
is_available=True
)
book1.save() # 保存到数据库
Book.objects.create(
title="Django实战开发",
author="张三",
publish_date="2023-03-20",
price=68.50
)
2.2 查询数据(Read)
2.2.1 基础查询
获取所有书籍:
all_books = Book.objects.all() # 返回QuerySet对象
按条件过滤:
books_by_author = Book.objects.filter(author="张三")
books_cheap = Book.objects.filter(price__lt=50) # 价格低于50元
books_2023 = Book.objects.filter(publish_date__year=2023)
2.2.2 查询优化技巧
- 只获取需要的字段:
books = Book.objects.values("title", "author")
- 分页处理:
from django.core.paginator import Paginator
paginator = Paginator(Book.objects.all(), 10)
page_books = paginator.get_page(1)
2.3 更新数据(Update)
book = Book.objects.get(id=1)
book.price = 89.90
book.save()
Book.objects.filter(price__lt=50).update(is_available=False)
2.4 删除数据(Delete)
Book.objects.get(id=2).delete()
Book.objects.filter(publish_date__year__lt=2020).delete()
三、进阶查询:让ORM更高效
3.1 聚合与统计
from django.db.models import Avg, Count
avg_price = Book.objects.aggregate(Avg("price")) # {"price__avg": 72.3}
author_books = Book.objects.values("author").annotate(total=Count("id"))
3.2 排序与切片
expensive_books = Book.objects.order_by("-price")[:5]
sorted_books = Book.objects.order_by("publish_date", "-price")
3.3 避免N+1查询问题
books = Book.objects.all()
for book in books:
print(book.author) # 每次循环都会触发一次数据库查询
books = Book.objects.defer("is_available").all() # 排除字段
四、实战案例:构建书籍管理API
4.1 创建视图
from django.http import JsonResponse
from .models import Book
def book_list(request):
books = Book.objects.all().values("id", "title", "price")
return JsonResponse(list(books), safe=False)
4.2 复杂查询组合
def search_books(request):
keyword = request.GET.get("q", "")
min_price = request.GET.get("min_price", 0)
results = Book.objects.filter(
title__icontains=keyword,
price__gte=min_price,
is_available=True
).order_by("-publish_date")[:10]
return JsonResponse(list(results.values()), safe=False)
五、常见问题与解决方案
5.1 字段长度限制导致的错误
问题:插入字符串超过CharField
的max_length
时会报错。
解决:在模型中增加字段长度,或使用TextField
替代。
5.2 时间字段格式问题
问题:Python的日期格式与数据库不匹配。
解决:使用DateField
时,输入datetime.date
对象或ISO格式字符串(如"2023-09-20")。
5.3 查询性能优化
建议:
- 对常用查询字段添加索引:
class Book(models.Model): title = models.CharField(max_length=100, db_index=True)
- 使用
explain
分析查询计划:from django.db import connection Book.objects.filter(...).explain()
结论:掌握单表操作是ORM进阶的基石
通过本文的学习,我们已经掌握了Django ORM在单表操作中的核心技能:从模型定义到复杂查询,从基础CRUD到性能优化。单表操作是构建复杂多表关系的起点,也是理解ORM工作原理的关键。
在实际开发中,建议遵循以下原则:
- 模型设计先行:在编写业务逻辑前,先完成模型设计和数据库迁移
- 善用ORM查询语法:避免直接拼接SQL字符串,利用Django提供的链式查询方法
- 监控查询性能:通过Django的调试工具(如Django Debug Toolbar)分析查询效率
Django ORM的强大之处在于它让开发者专注于业务逻辑,而非数据库细节。当你熟练掌握单表操作后,下一步可以探索多表关联、事务处理等高级功能,逐步成长为一名数据库操作的“翻译大师”。
通过本文的案例和代码示例,相信读者已经具备了在实际项目中独立完成单表数据管理的能力。接下来,不妨尝试将本文的书籍管理案例扩展为完整的Web应用,或结合自己的业务场景进行实践,让理论知识真正转化为开发技能。