django orm运行流程

本文深入探讨Django ORM的工作原理,包括模型加载过程、元类ModelBase的作用、Manager的实现机制,以及QuerySet的工作方式。解析了ORM如何自动为模型类创建object方法,以及Manager()对象如何提供一系列queryset方法。

(拜托 我这才是真的原理好么。。。网上看了一堆 都是使用方式?也可能我没找到真的原理。。。)

part1 加载过程

1、test/model.py
from django.db import models

class A(models.Model):
    name = models.CharField()
    
class Meta:
    db_table = "approve"

2、test/views.py

A.objects.filter(name='haha')

继承的models.Model 取的是
django/db/models/base.pyclass Model(six.with_metaclass(ModelBase)):
class Model是元类ModelBase的类对象,实现save() delete()
ModelBase主要有三个方法,newclass时候调用add_to_class增加一堆_meta属性、_prepare方法绑定manager,然后返回class

  • copy_managers(cls, base_managers):给cls添加base_managers里的manager属性
  • add_to_class(cls, name, value):实现setattr(cls, name, value)
  • _prepare(cls):发信号、读取options.py的_prepare方法,基础上重写,然后再实现ensure_default_manager(cls)

ensure_default_manager这个方法在manager.py中,主要目的实现下面两行。

# Ensures that a Model subclass contains a default manager  and sets the
    _default_manager attribute on the class. Also sets up the _base_manager
    points to a plain Manager instance (which could be the same as
    _default_manager if it's not a subclass of Manager).
cls.add_to_class('objects', Manager())
cls._base_manager = cls.objects

然后Manager()是啥呢?带有QuerySet信息的BaseManager对象

from django.db.models.query import QuerySet
class Manager(BaseManager.from_queryset(QuerySet)):
    pass

# BaseManager.from_queryset,创建class,并把queryset_class方法列表加到类里面
@classmethod
    def from_queryset(cls, queryset_class, class_name=None):
     	
     	……
     	
     	#BaseManager._get_queryset_methods,返回queryset_class方法列表
     	for循环:
        	class_dict.update(cls._get_queryset_methods(queryset_class))
        
        return type(class_name, (cls,), class_dict)

————————————
所以,写了class A(models.Model)以后,orm会自动为类创建object方法,值为Manager()对象,然后Manager()对象返回的是一个类,这个类具有一堆queryset方法,并且orm为当前类初始化一些_meta信息
————————————

part2 queryset工作方式

django/db/models/query.pyclass QuerySet(object)
上面from_queryset方法内用for循环了queryset_class 所以调用时候就会循环class QuerySet(object)def __iter__(self)方法
顺序如下:
def __iter__(self)——>def _fetch_all(self)——>def iterator(self)

def iterator(self):
    """
    An iterator over the results from applying this QuerySet to the
    database.
    """
    db = self.db
    # 获取sql编译器,准备编译sql语句
    compiler = self.query.get_compiler(using=db)
    # 获取结果
    results = compiler.execute_sql()
    ……
    for row in compiler.results_iter(results):
        obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])
        ……
        yield obj
### Django ORM 架构详解 Django 的对象关系映射器(Object-Relational Mapping, ORM)是一种强大的工具,用于简化数据库操作并提供高层次的抽象接口。它允许开发者通过 Python 对象来处理数据库中的数据,而无需编写复杂的 SQL 查询语句。 #### 1. ORM 基本概念 ORM 是一种编程技术,旨在解决面向对象编程语言与关系型数据库之间的阻抗不匹配问题。在 Django 中,模型类定义了表结构以及字段属性,这些模型会被自动转换成对应的数据库表[^1]。当执行查询时,Django ORM 将用户的高层请求翻译为底层的 SQL 操作,并返回相应的结果集。 #### 2. Django ORM 的核心组件 以下是构成 Django ORM 的几个主要部分: ##### (1) **Model 层** 这是整个 ORM 系统的基础单元,在这里定义的数据模型会对应到实际存储于 RDBMS 上的一张表格。每一个 field 都表示该 table 下的一个 column[^3]。 ```python from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey('Author', on_delete=models.CASCADE) class Meta: db_table = 'books' ``` 上述代码片段展示了如何利用 Model 来描述书籍实体及其关联作者的关系。 ##### (2) **Manager 和 QuerySet** 每个 model 默认拥有一个名为 `objects` 的 manager 实例,它是获取 querysets 或者单独记录的主要途径之一。QuerySets 提供了一种灵活的方式来检索、过滤甚至修改集合内的条目。 示例如下: ```python # 获取所有书本列表 all_books = Book.objects.all() # 查找特定条件下的书籍 filtered_books = Book.objects.filter(title__icontains='Python') ``` ##### (3) **Field 类型支持** 为了适应不同种类的信息需求,Django 自带了一系列预置 fields 支持多种常见数据类型如整数(integers),字符串(strings), 时间日期(datetime objects)等等。 #### 3. 数据库交互过程解析 当调用某个方法比如 `.save()` 或者 `.delete()` 时候,背后发生的事情包括但不限于以下几步: - 转化 python 表达式成为 sql statement; - 执行生成后的 sql command 并捕获可能产生的异常情况; - 如果涉及新增/更新动作,则同步刷新内存缓存状态; 这一系列流程都被封装隐藏起来使得最终使用者只需关注业务逻辑层面即可完成大部分常规任务[^2]。 #### 4. 插件增强能力 除了内置的功能外,还有众多优秀的社区贡献模块能够进一步提升开发效率或者满足特殊场景的需求。比如说借助 rest_framework 可快速搭建 api 接口服务端程序。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值