Django模型1对多和多对多关系

django数据模型用python类的属性和方法方式对数据库表进行了映射,在操作数据库过程中,我们是对每个模型对象进行操作,而不是采用底层sql的方式,当然可能有的人喜欢用sql的方式直接操作数据库,我之前也是写sql对数据进行操作,但话说回来,既然我们选择用了用django框架开发,那我们就应该充分利用框架给我们提供好的方式去进行,这样既符合django的设计哲学,当然也给我们开发带来很多便利,那今天我们就从基本的说起,因为既然谈数据库,就不得不说实体,而实体之间就存在的各种关系,所以今天我们就说下django模型的1对多和多对多关系。

在开始我们django模型关系时,为方便我们更好的理解django模型,我们先从我们熟悉的基本关表讲起,我们先得了解一个基本问题,什么是1对多、多对多,为什么存在,我们该如何用关系型数据库表去描述,如何你对以上问题摸不着头脑,那么莫着急,我们一一说来,简单说我们刚才说的都是关系型数据库中数据描述实体之间的关系,什么是实体,书中讲的都很抽象,我们举几个例子很容易说明:比如一个学生就是一个实体,一个老师也是一个实体,一个球员也是一个实体,球队等这些都是所说的实体,每个实体都有自己的属性,比如学生就有姓名,性别,球员有编号,姓名,球队有队名等,通过这些实体的属性描述,在我们现实世界中会很容易发现他们其实是有关系的,比如球员和球队的关系,我们如何来分辨是到底是哪种关系呢?其实有一个很简单的办法(在这里我要感谢我大学老师,哈),找个纸,把多个实体画出来(比如用方框表示),然后用笔在其中一个实体上写上1,然后开始读1个xx对应xx实体,写完后然后反过来再来,表另一个实体写上1,再翻过来读一次,如何其中有发现某个实体是多的就写上m,如果两边读完都是多对多的就写上n:m,利用该方法,很容易实体出实体之前的关系,示意图如下:

111

 

上面两个图分别表示了多对1和多对多关系,其实多对1也是反过来的1对多,没什么区别,那我们需要了解,在没有models模型前,我们是数据表中如何处理呢,比如我们就拿上面实体来举例说明:

学生(姓名,班号)和班级(班号),因为1个班级可以有多个学生,而一个学生只能属于1个班级,所以他们是1对多关系,用关系数据库描述需要在多的一方(学生)增加班号外键关联到班级中的班号,这样就可以查每个学生属于哪个班号了。

然后我们看多对多关系,学生(学号,姓名)和课程(课程号),因为一个学生可以选择多门课程,1门课程可以被多个学生选择,所以他们是多对多的关系,我们该如何建立他们之间关系呢,如何找出某个学生学习的课程呢,用我们上面的方法是不行了,因为这两个实体都是多的一方,所以呢,要建立他们之间的关系,我们需要多建立一个关系表,这个关系表中存储学号和课程号,并设置外键分别关联到学生和课程表中,这样就变成了两个1对多,1个学生可以选择多门课程,1门课程可以被多名学生选择,这样就可以根据他们的关系查找每个学生所学的课程了,基本的理论我们就说到这,我们接下来讲django模型。

我们之所以上面讲那么多,主要是为我们理解django模型做铺垫,因为理解了上面,再理解我们的模型就比较容易了,再加上django框架有一部分都帮我们做了,我们只管使用就好了,也很方便,但原理我们还是要懂一些的,避免出现问题,开始抓瞎呀,我们建立模型:

以上就是基本的模型,为方便说明,我只列了需要的字段,实际工作中会比这个复杂些,但万变不离其宗,理解了这个简单的,看其它的也会容易,需要说明的用django模型,不要特别指定id,因为djang在建立数据表的时候会默认建立一个自增长的id, 对于多对多方面,你也不需要建立多余模型,django会自动为你建立一个关系表来描述两个实体的关系,所以这就是用框架的好处,可以让你少些很多代码,而且从另一方面讲,你的代码野会变得比较强壮,今天我们就讲到这里了,下一篇我们讲如何通过数据模型对数据库表进行操作。