django数据模型中如何支持多表连接

django数据模型中如何支持多表连接

目前我在官方站上只看到单一建表的操作,要是例如:

select * from a left join b.... 此类的表操作要如何建模?
另外django 中限制了表名,请问如何对已存在表进行操作(不直接执行SQL)
django中支持一对一,多对多,多对一的关系定义。但一般是先得到一个表的对象,然后通过这个对象再得到其它表的对象,所以不是一次性查所相关表的所有字段。因为django是采用ORM的处理方式。如果要实现复杂的多表查询,要使用底层的cursor来处理。

对于使用现存表,可以在Meta子类中定义db_table属性值。具体的请参考django的关于model的文档。
是不是可以认为django的ORM模式的数据库操作还是存在一定的弊病呢?
ORM方式与简单的SQL的方式本来就不一样。ORM在处理单条记录时,以对象方式来操作很方便,但对于复杂的查询,多表组合就不方便了。我想这是出于使用目的不同造成的。没有万能药。Sqlalchemy在这方面可能不错,它但其实是可以让你选择是使用ORM来是SQL方式,是一个集成。而Django没有提供包装得比较好的SQL的方式。虽然它提供了extra子句,但可能还不是足够方便。
谢谢偶像limodou

看来以后要SQL 加 ORM混合使用了,因为基本上一个稍大点的网站都是多表联合查询的
强烈建议你使用 sqlalchemy !

QUOTE:
Sqlalchemy在这方面可能不错,它但其实是可以让你选择是使用ORM来是SQL方式,是一个集成。

我觉的 sqlalchemy 不是简单的集成而已,sqlalchemy 才是真正的 ORM 的思维。
关系系统自有它自己的思维模式,而 django 的 ORM 是通过弱化关系系统而把它塞到OO中里面,甚至都不算OO,因为继承、多态这些东西还没有做,可以说只是对关系系统的一种弱化而已,大部分情况下还是很好用的。

sqlalchemy 的哲学是把数据库当作关系系统来对待,正视关系系统与OO系统的这种巨大的差异,通过 mapping 将它们联系起来。sqlalchemy 之美很大程度上体现在它的 mapping 上。
我想这篇文章可以让你快速体会到 sqlalchemy 在处理复杂关系系统时的灵活:
http://spyced.blogspot.com/2007/ ... y-impresses-me.html

sqlalchemy 文档很全,不过上手可能并不容易,你自己抉择了。

QUOTE:
对于使用现存表,可以在Meta子类中定义db_table属性值。具体的请参考django的关于model的文档。

db_table 属性好像不是用来使用现存表的,只是指定生成的表的名字吧,要使用现存表,可以看看 django book 这一章:http://www.djangobook.com/en/beta/chapter17/
前不久才在啄木鸟上编辑了 SQLAlchemy 的页面:http://wiki.woodpecker.org.cn/moin/SQLAlchemy
要是你对sqlalchemy有兴趣,可以一起丰富
关系系统与ORM并不是相同的概念。SQLAlchemy的好处是既可以以对象方式来访问,也可以以传统的方式,记录的方式来访问。所以它是一个集成的东西。Django本身只是ORM,ORM的处理方式与关系系统本本来就不同。所以我不认为django的ORM不好。而且继承,多态这些东西如何去与关系系统相对应,并没有定论。SA的方式只是其中一种,而且只能算是一种简化的方式。因为通过mapping,你只能把关系系统向对象上对映射,但反过来如何呢?SA也不好解决这个问题。而Django的方式还是以Model为主,反而我认为这更是从对象的角度出发,但因为后台是关系的,所以这种方式处理起来并不实用。不过这些倒无所谓,反正你可以自由选择。在很多时候,django的已经够用了。而且它的关系映射我认为还是比较简单。当初看SA的关系映射时就觉得有些麻烦。

关于db_table,下面是从model_api文档中拷贝的:

db_table

The name of the database table to use for the model:

db_table = 'music_album'

If this isn't given, Django will use app_label + '_' + model_class_name. See "Table names" below for more.

If your database table name is an SQL reserved word, or contains characters that aren't allowed in Python variable names -- notably, the hyphen -- that's OK. Django quotes column and table names behind the scenes.

所以,如果不存在这个表,这个db_table就是指定生成的表名,如果已经存在,自然就是使用存在的表名了。一个属性是多种用途的。


QUOTE:
关系系统与ORM并不是相同的概念。SQLAlchemy的好处是既可以以对象方式来访问,也可以以传统的方式,记录的方式来访问。所以它是一个集成的东西。

ORM 就其字面上来说就是个映射,sqlalchemy 中将这个映射独立出来显式地处理,其实 hibernate 这种老牌的 ORM 就是这种处理方式。
你说的以记录的方式访问指的是直接通过python表达式构造查询语句吧,这个也属于 sqlalchemy 的一部分,不过我以为不能算在 ORM 里面,sqlalchemy 做为 ORM 的精髓在它的 mapping 上。我上面说的也是 sqlalchemy 做为 ORM 的这部分。

QUOTE:
Django本身只是ORM,ORM的处理方式与关系系统本本来就不同。所以我不认为django的ORM不好。

不是不好只是有的时候不够而已,当然够的时候是很好用的。
所以也不是说楼主一定要用 sqlalchemy。
既然楼主选择了 django 的话,使用 sqlalchemy 估计就不是很方便了,在 django 中直接使用 sql 语句也是一种选择。

QUOTE:
而且继承,多态这些东西如何去与关系系统相对应,并没有定论。SA的方式只是其中一种,而且只能算是一种简化的方式。因为通过mapping,你只能把关系系统向对象上对映射,但反过来如何呢?SA也不好解决这个问题。

关于 sqlalchemy 对继承和多态的处理:http://www.sqlalchemy.org/docs/a ... mapping_inheritance
有几种映射的方式,当然这个还处在 alpha 阶段,邮件列表里也有人说还有bug。

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

另外,我看到楼主的系统还有遗留数据库要处理,似乎django并不是特别适合,有没有试过其它的
现在除了 django 以外几乎所有 web 框架的ORM都默认 sqlalchemy 了。