深入学习Django源码基础9 - 简单分析DjangoORM部分

现在MVC架构开发中。m部分是提供底层数据。无论是cs还是bs越来越看重数据对象的业务处理,而不是以前原生的sql得到的数据。

因此,1个通用的关系数据库字段对应对模型对象的框架就比较重要了。有了他可以节省大量的开发时间。


本篇侧重简要分析django中的orm。


对于orm,既然是通用,那么就存在5个重要问题。

1:如何多数据库的支持

2:对象字段类型的提供

3:sql->object如何实现转换

4:object->sql如何存储

5:数据库字段关联关系在对象中的对应。


11分析如上几个问题。

1:对于多数据库支持,这个问题比较好解决,因为sql通用的操作代码比较多。差别在细微和一些数据库特性。数据库联接上。基于分层思想。

高层封装sql通用方法类。特性方法。和数据库操作方法类。在具体对应的数据库实现文件中针对性改写。

根据猜想,分析django.db.backends模块下文件。得到

backends
….
|----sqlite3
     |----__init__.py
     |----base.py				基于sqlite3构造继承数据库基类。填充sqlte3特性,完善sqlte3的运算操作与游标
     |----client.py				本地执行sqlite3 构造db文件
     |----creation.py			提供构造数据库的model与数据库字段对应关系,填充创建方法
     |----introspection.py		提供自省对应的model与数据库字段关系,填充自省方法
__init__.py				数据库基础,特性,运算操作,自省,本地执行,验证 等基类封装
creation.py					构造数据库基类封装
signals.py					数据库构造信号
util.py					游标,调试游标(记录时间)封装


问题2:对象字段类型的提供。

sql语句与iphone的视图与android的控件一样。都是1个提供比较同样方法或者属性的集合。细微差别在子类实现时候差异化。

对于sql提供的字段,有整形,布尔型,字符,浮点,日期等。。。

这段比较不熟悉,因此分析models的模块得到如下目录

models
|----fields
     |----__init__.py			对象的基类与对象类
     |----fies.py				文件对象
     |----proxy.py				代理类,暂时还不知道用途
     |----related.py				关联关系(1对多,多对多,反向,主见,1对1)
     |----subclassing.py			暂时不知道
|----sql
     |----__init__.py
     |----aggregates.py			集合类,用于组合sql字段模版,重点是as_sql
     |----complier.py			sql语句组合类,最终查询是通过此类实现    
     |----constants.py			常量
     |----datastructures.py		暂时不清楚
     |----expressions.py			评估程序?暂时不清楚
     |----query.py				查询
     |----subqueries.py			增删改查表达式(从Qeury文件中继承)
     |----where.py				
__init__.py
aggregates.py				集合类,平均数,统计,最大,最小,stdDev,求和,方差
base.py					模型基类
constants.py				
deletion.py					删除的集合类collecor
expression.py				逻辑运算表达式
loading.py					加载 加载应用程序于模型,注册模型,等方法的封装
manager.py				对象管理类。对象管理描述符类
options.py					模型对象支持的选项
query.py					查询集合类(基类,值类,值列表,时间,空)
query_utils.py				查询包装
related.py
signals.py					操作相关的信号定义


大致根据如上的代码详细查看源代码会方便理解。


有了sql的连接管理,有了model提供字段,如何管理对象。。

从django的使用上可以看出。

模型.管理.操作()[切片处理]得到QuerySet。其中QuerySet封装在models.query.py中。


下面就剩下3个问题。

3:sql->object,从QuerySet入手。分析iterator()

def iterator(self):
        """
        An iterator over the results from applying this QuerySet to the
        database.
        """
        ...

        # Cache db and m
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值