Django ORM 的核心部件可分为模型系统 、查询系统 、数据库后端 和辅助工具四大类,每个部件负责不同的职责,共同实现对象与关系数据库的映射。以下是核心部件的分层解析:
一、模型系统(Model System)
1. 模型基类(Model Base Class)
- 作用:所有模型类的基类,提供ORM核心功能。
- 核心类 :
django.db.models.Model
- 关键特性 :
- 通过元类(
ModelBase
)解析模型字段和元数据。 - 自动生成主键字段(
id
)。 - 提供对象级的数据库操作方法(如
save()
、delete()
)。
- 通过元类(
2. 字段类(Field Classes)
- 作用:定义模型字段与数据库列的映射关系。
- 核心类 :
- 基础字段:
CharField
、IntegerField
、BooleanField
等。 - 关系字段:
ForeignKey
、ManyToManyField
、OneToOneField
。 - 特殊字段:
DateTimeField
、DecimalField
、FileField
等。
- 基础字段:
- 关键特性 :
- 负责数据类型转换(如Python
datetime
→ SQLTIMESTAMP
)。 - 处理字段约束(如
null
、unique
、max_length
)。 - 通过
validators
实现数据验证。
- 负责数据类型转换(如Python
3. 元数据类(Meta Class)
-
作用:定义模型的数据库级元数据。
-
核心属性 :
db_table
:指定数据库表名。indexes
:定义索引。ordering
:默认排序规则。unique_together
:联合唯一约束。
-
示例 :
pythonclass Book(models.Model): class Meta: db_table = "books" indexes = [models.Index(fields=["title"])]
二、查询系统(Query System)
1. 查询集(QuerySet)
- 作用:表示从数据库获取的对象集合,支持链式操作。
- 核心类 :
django.db.models.query.QuerySet
- 关键方法 :
- 过滤:
filter()
、exclude()
、get()
。 - 排序:
order_by()
、reverse()
。 - 切片:
queryset[0:10]
(不触发SQL)。 - 聚合:
count()
、sum()
、avg()
。
- 过滤:
- 特性:惰性执行,仅在需要数据时生成SQL。
2. 查询表达式树(Query Expression Tree)
-
作用:存储查询条件的抽象语法树。
-
核心类 :
django.db.models.sql.Query
-
关键组件 :
WhereNode
:表示SQL的WHERE
子句。OrderBy
:表示排序规则。Join
:处理表连接逻辑。
-
示例 :
python# 表达式树结构:[Filter(author="Doubao"), OrderBy("-price")] Book.objects.filter(author="Doubao").order_by("-price")
3. 查询表达式(Query Expressions)
-
作用:定义复杂查询条件。
-
核心类 :
Q()
对象:实现复杂逻辑(如OR条件)。F()
表达式:引用模型字段值(如F('price') * 0.9
)。Func()
表达式:调用数据库函数(如UPPER(title)
)。
-
示例 :
pythonfrom django.db.models import Q, F # 查询价格大于50且作者是Doubao,或价格小于20的书 Book.objects.filter(Q(price__gt=50) & Q(author="Doubao") | Q(price__lt=20))
三、数据库后端(Database Backends)
1. 数据库连接(Database Connection)
-
作用:管理与数据库的物理连接。
-
核心类 :
django.db.backends.*.base.DatabaseWrapper
-
支持的数据库 :
- PostgreSQL:
django.db.backends.postgresql
- MySQL:
django.db.backends.mysql
- SQLite:
django.db.backends.sqlite3
- Oracle:
django.db.backends.oracle
- PostgreSQL:
-
配置示例 :
pythonDATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'mydatabaseuser', 'PASSWORD': 'mypassword', } }
2. SQL 编译器(SQL Compiler)
-
作用:将查询表达式树转换为数据库特定的SQL。
-
核心类 :
django.db.backends.*.compiler.SQLCompiler
-
关键方法 :
as_sql()
:生成SQL语句和参数。execute_sql()
:执行SQL并返回结果。
-
示例 :
python# Python 查询 Book.objects.filter(author="Doubao") # PostgreSQL 生成的 SQL SELECT "books"."id", "books"."title", "books"."author" FROM "books" WHERE "books"."author" = 'Doubao';
3. 模式生成器(Schema Editor)
- 作用:根据模型定义生成数据库模式(表、索引、约束)。
- 核心类 :
django.db.backends.*.schema.BaseDatabaseSchemaEditor
- 关键方法 :
create_model()
:创建表。alter_field()
:修改字段。delete_model()
:删除表。
四、辅助工具(Utility Components)
1. 事务管理器(Transaction Management)
-
作用:管理数据库事务。
-
核心类 :
django.db.transaction.atomic
-
使用方式 :
pythonfrom django.db import transaction with transaction.atomic(): Book.objects.create(title="New Book") # 嵌套事务 with transaction.atomic(): Book.objects.filter(price__lt=10).delete()
2. 数据库路由器(Database Router)
-
作用:实现多数据库的路由策略。
-
核心接口 :
django.db.router.BaseRouter
-
示例配置 :
pythonclass MyRouter: def db_for_read(self, model, **hints): if model._meta.app_label == 'analytics': return 'analytics_db' return 'default'
3. 迁移系统(Migrations)
-
作用:管理数据库模式变更。
-
核心组件 :
makemigrations
:生成迁移文件。migrate
:执行迁移。Migration
类:表示一次模式变更。
-
迁移文件示例 :
pythonclass Migration(migrations.Migration): dependencies = [('myapp', '0001_initial')] operations = [ migrations.AddField( model_name='book', name='is_published', field=models.BooleanField(default=False), ), ]
五、核心部件协作流程
- 模型定义 :开发者定义继承自
Model
的类,声明字段和元数据。 - 查询构建 :通过
objects
管理器创建QuerySet
,添加过滤、排序条件。 - SQL 生成 :
Query
对象将查询条件转换为表达式树,由SQLCompiler
生成SQL。 - 数据库交互 :
DatabaseWrapper
建立连接,执行SQL并获取结果。 - 结果映射:将数据库行数据转换为模型对象或值列表。