免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: bs
打印 上一主题 下一主题

django数据模型中如何支持多表连接 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-01-26 22:13 |只看该作者
ORM是映射,但关系系统是你提的概念,不知道是从哪里来的,在我理解上它的映射应该只是列表方式,而不是对象方式。所以我说两者不一样。也许和你所理解的关系系统有所不同。但关系系统这个提法实在是少见。所以我猜想会不会是关系数据库类似的东西。

而我所说的记录方式并不是生成查询语句,是指生成是list记录方式来说的。因为sa支持它,而且很不错。我也没有认为它属于ORM的一部分。所以我说这是sa所特长的。

关于反过来映射。因为事实证明关系模型适合于描述数据及其关系,关系模型这么多年的发展有一整套的理论,而且多年来人们也习惯了使用关系模型思考。OO 本来也不是用来描述数据的。ORM 也就是用来在关系数据库上铺上一层对象,把关系数据库里的概念映射成对象的属性,让系统其他 OO 的部分方便使用关系库的数据。其实 django 的 ORM 里面 model 也就是对应数据表,ForeignKey 也还是关系数据库的概念。我想这一点上 sqlalchemy 和 django 并无不同。
django 的 ORM 只是在处理简单情况好用而已,这是它的优势。
而 sqlalchemy 处理简单情况的时候,像 django 支持的这种简单的 one-to-many, many-to-many关系,也不会复杂,只是重复的代码会多一些。


不同的场合有不同的思维方式。有些人习惯OO的方式,有些人习惯集合的方式,所以才需要不同的映射。这是使用习惯决定的。而ORM的好处除了映射,还可以针对表级,对象级增加处理方法,SA也是支持的,所以在这一点上,使用OO在处理上会更方便一些。当然如果不习惯可能不会这样用。所以django以Model为中心去更新关系数据库也是一种思路。记得还有一个ORM模块叫de什么的好象也是这样,不过我没有看过具体的内容。django对关系的定义和SQLObject差不多,而SA要复杂一些,不仅仅是重复,在我当时学时,好象不容易理解。所以对于OO可能我与你不太一样。OO简单地说是数据与操作的混合,就好比在C++中,把struct升级为class再加些方法就差不多了。所以OO描述对象很正常。而且许多OO的教材也是说对象,属性,方法,而属性就是数据。而增加方法就会更方便。比单独的数据集合使用起来要方便得多。所以不管是Django的ORM还是SA的ORM能做到的不仅仅就是数据的映射,同时还有对它的操作。特别是django的Model为了方便处理admin,还增加了相关的参数设置,这也不是单纯数据库的ORM库可以做到的。而是django自成体系的一种表现。不是说它有多好,只是想说它有着别的模块没有的特点,而这种特点正是由于它是针对于Django才具备的,你单独拿出来与其它的来比,可能就没有多大用了。

用哪个ORM看自已的选择,能做就行了。django不行就sa上。

论坛徽章:
0
12 [报告]
发表于 2007-01-26 22:37 |只看该作者
关系系统就是说关系数据库。
我认为 ORM 都是把关系数据库中的行映射为对象的实例,这一点上我认为 django 和 sqlalchemy 是一样的。
对于简单的关系,比如 one-to-many,sqlalchemy 也很简单:
articles_table = ...
comments_table = ...
class Article(object):pass
class Comment(object):pass

mapper(Article, articles_table, properties=dict(
  comments = relation(mapper(Comment, articles_table))
))

而再给 relation 传些参数就能完成些 django 所不能完成的任务了,比如 lazy=False 就是 left outer join 了,甚至 relation 第一个参数还能是子查询!

django 只是把一些过程隐含地处理掉了,把 table,class 的定义合并了,mapping 也不用显式地写出来了,many-to-many 的中间表也自动完成了。

也正因为基本思想一致,所以可以在 sqlalchemy 的基础上构造 turboentity [http://turboentity.ematia.de/] 这样的东西了。

论坛徽章:
0
13 [报告]
发表于 2007-01-26 22:55 |只看该作者
mapper(Article, articles_table, properties=dict(
  comments = relation(mapper(Comment, articles_table))
))


正是由于这样的语法,我认为它还不是一般理解上的对象关系。当然我说的只是从表面上看去,看上去更象是一种运算的结果。而不是简单的ForeignKey(User) , ManyToManyField(User) 这样的对象的描述。不否认SA的功能很强,只不过在简单情况下的确复杂一些。

django 只是把一些过程隐含地处理掉了,把 table,class 的定义合并了,mapping 也不用显式地写出来了,many-to-many 的中间表也自动完成了。


正如我前面所说django的ORM还是针对django项目本身,所以有使用场合的限定,使它很方便。各有各的好处。

论坛徽章:
0
14 [报告]
发表于 2007-02-13 17:06 |只看该作者
说来说去结果还是,SQL自身的语言最能表达关系....

请问limodou,如何在django里面直接执行SQL,谢谢
[找到了,还是 http://bbs.chinaunix.net/viewthread.php?tid=897892]

[ 本帖最后由 bs 于 2007-2-13 17:11 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP