当前位置: 首页 > article >正文

Django orm详解--组成部件

Django ORM 的核心部件可分为模型系统查询系统数据库后端辅助工具四大类,每个部件负责不同的职责,共同实现对象与关系数据库的映射。以下是核心部件的分层解析:

一、模型系统(Model System)

1. 模型基类(Model Base Class)
  • 作用:所有模型类的基类,提供ORM核心功能。
  • 核心类django.db.models.Model
  • 关键特性
    • 通过元类(ModelBase)解析模型字段和元数据。
    • 自动生成主键字段(id)。
    • 提供对象级的数据库操作方法(如save()delete())。
2. 字段类(Field Classes)
  • 作用:定义模型字段与数据库列的映射关系。
  • 核心类
    • 基础字段:CharFieldIntegerFieldBooleanField等。
    • 关系字段:ForeignKeyManyToManyFieldOneToOneField
    • 特殊字段:DateTimeFieldDecimalFieldFileField等。
  • 关键特性
    • 负责数据类型转换(如Python datetime → SQL TIMESTAMP)。
    • 处理字段约束(如nulluniquemax_length)。
    • 通过validators实现数据验证。
3. 元数据类(Meta Class)
  • 作用:定义模型的数据库级元数据。
  • 核心属性
    • db_table:指定数据库表名。
    • indexes:定义索引。
    • ordering:默认排序规则。
    • unique_together:联合唯一约束。
  • 示例
    class 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:处理表连接逻辑。
  • 示例
    # 表达式树结构:[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))。
  • 示例
    from 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
  • 配置示例
    DATABASES = {'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 查询
    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
  • 使用方式
    from django.db import transactionwith 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
  • 示例配置
    class MyRouter:def db_for_read(self, model, **hints):if model._meta.app_label == 'analytics':return 'analytics_db'return 'default'
    
3. 迁移系统(Migrations)
  • 作用:管理数据库模式变更。
  • 核心组件
    • makemigrations:生成迁移文件。
    • migrate:执行迁移。
    • Migration类:表示一次模式变更。
  • 迁移文件示例
    class Migration(migrations.Migration):dependencies = [('myapp', '0001_initial')]operations = [migrations.AddField(model_name='book',name='is_published',field=models.BooleanField(default=False),),]
    

五、核心部件协作流程

  1. 模型定义:开发者定义继承自Model的类,声明字段和元数据。
  2. 查询构建:通过objects管理器创建QuerySet,添加过滤、排序条件。
  3. SQL 生成Query对象将查询条件转换为表达式树,由SQLCompiler生成SQL。
  4. 数据库交互DatabaseWrapper建立连接,执行SQL并获取结果。
  5. 结果映射:将数据库行数据转换为模型对象或值列表。
http://www.lryc.cn/news/2392116.html

相关文章:

  • Tomcat 使用与配置全解
  • Chrome 开发中的任务调度与线程模型实战指南
  • aws instance store 的恢复
  • 从零开始创建 Vue 3 开发环境并构建第一个 Demo
  • EasyRTC音视频实时通话助力微信小程序:打造低延迟、高可靠的VoIP端到端呼叫解决方案
  • STM32 SPI通信(软件)
  • 每日刷题c++
  • (自用)Java学习-5.19(地址管理,三级联动,预支付)
  • 【容器】docker使用问题处理
  • ChemDraw 2023|Win英文|化学结构编辑器|安装教程
  • Vue3实现提示文字组件
  • JAVA与C语言之间的差异(一)
  • 深入剖析 C 语言中的指针数组与数组指针
  • 4.1.1 Spark SQL概述
  • 【VSCode-Qt】Docker远程连接的项目UI文件在 VSCode 上无法预览
  • redis五种数据结构详解(java实现对应的案例)
  • Telnet 命令详解
  • 深度解析新能源汽车结构与工作原理
  • React 生命周期与 Hook:从原理到实战全解析
  • OpenSSL 与 C++ 搭建一个支持 TLS 1.3 的服务器
  • HOW - 简历和求职面试宝典(六)
  • 【机器学习基础】机器学习入门核心算法:逻辑回归(Logistic Regression)
  • 深入理解设计模式之命令模式
  • 智能仓储落地:机器人如何通过自动化减少仓库操作失误?
  • Android 架构演进之路:从 MVC 到 MVI,拥抱单向数据流的革命
  • [低代码表单生成器设计基础]ElementUI中Layout布局属性Form表单属性详解
  • 数据结构7——二叉树
  • 从“被动养老”到“主动健康管理”:平台如何重构代际关系?
  • Java 中的 synchronized 和 Lock:如何保证线程安全
  • 贪心算法应用:最大匹配问题详解