Django ORM模型基础:从定义到数据操作完整指南
本文详解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中进行数据库开发的标准流程如下:
- 首先,在应用的models.py文件中定义模型类。
- 接着,生成迁移文件,执行命令:
python manage.py makemigrations。 - 随后,执行迁移以生成数据库表(Django默认使用SQLite3数据库,生成的数据库文件名为db.sqlite3):
python manage.py migrate。 - 最后,通过定义好的模型类和对象实例,对数据库数据进行增删改查操作。
模型类定义与字段类型
模型类设计规范
以下通过具体案例演示模型类的构建过程:
定义部门类(Department):
-
包含字段:部门名称 name。
-
包含字段:部门成立时间 create_date。
定义员工类(Employee):
-
包含字段:姓名 name。
-
包含字段:年龄 age。
-
包含字段:性别 sex。
-
包含字段:工资 salary。
-
包含字段:备注信息 comment。
关键注意事项:
在应用的models.py文件中编写模型类时,必须继承自models.Model基类。
在模型类内部定义属性,这些属性将对应生成数据库表中的字段:
属性名 = models.字段类型(字段选项)
常用字段类型(初步了解,均位于models包下):
- CharField:用于存储字符串。
- IntegerField:用于存储整型数据。
- BooleanField:用于存储布尔值。
- DateField:用于存储日期数据。
- DecimalField:用于存储浮点数或高精度小数。
- 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程序设计提供有益帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









