Django ORM模型基础:从定义到数据操作完整指南

温以宁
温以宁
发布时间:2026-10-13| 4人浏览过
原创

本文详解Django框架中的ORM机制,介绍如何通过模型类映射数据库表。涵盖模型字段类型、迁移命令makemigrations与migrate的使用,以及利用save和delete方法进行数据增删改查。同时解析模型管理器objects的用法及一对多关联查询技巧,帮助开发者高效进行数据库交互。

本文详细介绍Django框架中模型(Model)的基础概念与实际操作方法,旨在帮助读者理解并掌握Django的数据处理流程。

Django ORM原理与开发流程

ORM原理概述

  • ORM全称为Object Relational Mapping(对象关系映射)。
  • 其核心思想是将面向对象编程中的类与数据库中的表建立一一映射关系。开发者只需操作类和对象实例,即可对数据库表执行增删改查等操作,无需手动编写SQL语句,底层由ORM框架自动生成相应的SQL。
  • Django内置了完整的ORM实现,在Django项目与后端数据库之间充当桥梁角色。

借助ORM的灵活配置,开发者可以便捷地切换不同的数据库后端,而无需大幅修改业务代码。

在Django中进行数据库开发的标准流程如下:

  1. 首先,在应用的models.py文件中定义模型类。
  2. 接着,生成迁移文件,执行命令:python manage.py makemigrations。
  3. 随后,执行迁移以生成数据库表(Django默认使用SQLite3数据库,生成的数据库文件名为db.sqlite3):python manage.py migrate。
  4. 最后,通过定义好的模型类和对象实例,对数据库数据进行增删改查操作。

模型类定义与字段类型

模型类设计规范

以下通过具体案例演示模型类的构建过程:

定义部门类(Department):

  • 包含字段:部门名称 name。

  • 包含字段:部门成立时间 create_date。

定义员工类(Employee):

  • 包含字段:姓名 name。

  • 包含字段:年龄 age。

  • 包含字段:性别 sex。

  • 包含字段:工资 salary。

  • 包含字段:备注信息 comment。

关键注意事项:

在应用的models.py文件中编写模型类时,必须继承自models.Model基类。

在模型类内部定义属性,这些属性将对应生成数据库表中的字段:

属性名 = models.字段类型(字段选项)

常用字段类型(初步了解,均位于models包下):

  1. CharField:用于存储字符串。
  2. IntegerField:用于存储整型数据。
  3. BooleanField:用于存储布尔值。
  4. DateField:用于存储日期数据。
  5. DecimalField:用于存储浮点数或高精度小数。
  6. ForeignKey:用于定义外键,建立一对多关系。

无需手动定义主键id,Django会自动生成自增的主键id字段。

数据库迁移与表结构查看

模型类生成数据库表的流程

第一步,根据定义好的模型类生成迁移文件。


python manage.py makemigrations

第二步,执行迁移文件以创建数据库表。


python manage.py migrate

生成表的默认命名格式为:


应用名_模型类名小写

可使用sqliteman工具查看生成的数据库表结构。

安装sqliteman工具。


sudo apt-get install sqliteman

启动sqliteman程序。


sqliteman

启动后,通过File -> Open菜单打开项目目录下的db.sqlite3数据库文件即可查看表结构。

数据增删改查操作

通过ORM操作数据库数据

  • Django实现了ORM功能,在Django项目中无需编写SQL语句,直接通过模型类和对象实例即可操作数据库数据。

可通过以下命令进入Python交互环境,执行操作数据库的代码:


python manage.py shell

数据的增删改操作

调用模型类对象的save()方法,即可实现数据的新增或修改。若id值在数据库表中不存在或为空,则执行新增操作;否则执行修改操作。


模型类对象.save()  # 新增或修改

调用模型类对象的delete()方法,即可实现数据删除,系统会根据对象的id进行删除。


模型类对象.delete() # 根据对象的id进行删除

具体代码示例:


from app01.models import Department, Employee
from datetime import date
d = Department()
d.name ='研发部'
d.create_date = date(2017,1,1)
d.save() # 新增
d.name ='人事部'
d.save() # 修改
d.id = 10
d.save() # 新增
d.name = '研发部'
d.id = None
d.save() # 新增
d.id = None
d.save() # 新增
d.delete() # 删除

模型管理器与关联查询

模型管理器(Manager)

每个模型类默认都拥有objects类属性,称为模型管理器。它由Django自动生成,类型为django.db.models.manager.Manager。


>>> Employee.objects
<django.db.models.manager.Manager object at 0x7fcfcdf67550>

objects模型管理器中提供了多种查询数据的方法:

objects管理器中的方法 返回类型 作用
模型类.objects.get() 模型对象 返回一个对象,且只能有一个:
如果查到多条数据,则报错:MultipleObjectsReturned
如果查询不到数据,则报错:DoesNotExist
模型类.objects.filter() QuerySet 返回满足条件的对象
模型类.objects.all() QuerySet 返回所有的对象

关联查询操作

部门和员工之间存在一对多关系,如何根据部门查询员工,或根据员工查询部门呢?

具体用法如下:

假设在一对多关系中,处于“一”端的类称为一类,处于“多”端的类称为多类:

由一类对象查询多类对象的方法:


一类对象.多类名小写_set.all()

由多类对象查询一类对象的方法:


多类对象.关联属性

关联查询示例:


# 查询部门id为1的所有员工
d = Department.objects.get(id=1)
d.employee_set.all() # 一查多
# 查询id为1的员工所属的部门信息
e = Employee.objects.get(id=1)
e.department   # 多查一

希望本文所述内容能对大家基于Django框架的Python程序设计提供有益帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。