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 字段长度限制导致的错误

问题:插入字符串超过CharFieldmax_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工作原理的关键。

在实际开发中,建议遵循以下原则:

  1. 模型设计先行:在编写业务逻辑前,先完成模型设计和数据库迁移
  2. 善用ORM查询语法:避免直接拼接SQL字符串,利用Django提供的链式查询方法
  3. 监控查询性能:通过Django的调试工具(如Django Debug Toolbar)分析查询效率

Django ORM的强大之处在于它让开发者专注于业务逻辑,而非数据库细节。当你熟练掌握单表操作后,下一步可以探索多表关联、事务处理等高级功能,逐步成长为一名数据库操作的“翻译大师”。

通过本文的案例和代码示例,相信读者已经具备了在实际项目中独立完成单表数据管理的能力。接下来,不妨尝试将本文的书籍管理案例扩展为完整的Web应用,或结合自己的业务场景进行实践,让理论知识真正转化为开发技能。

最新发布