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

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


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

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

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

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

class Classes(models.Model):

   cls_num = models.CharField(max_length=30)


class Student(models.Model):

   name = models.CharField(max_length=30)

   cls_num = models.ForeignKey(Classes)


class Course(models.Model):

   c_num = models.ManyToManyField(Student)


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


©著作权归作者所有:来自51CTO博客作者mb5fdb12e4adbb2的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 同步异步多线程这三者关系,你能给面试官一个满意的回答吗?
  2. 如何检测社交网络中两个人是否是朋友关系(union-find算法)
  3. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
  4. 你说的 Flink 和搜索引擎有什么关系
  5. Android(安卓)Ormlite 学习笔记2 -- 主外键关系
  6. Android的嵌入式关系型SQLite数据库使用
  7. GreenDao讲解与使用
  8. android 中的 window,view,activity具体关系
  9. AndroidStudio 优秀的第三方数据库 GreenDao

随机推荐

  1. Android常见问题总结(七)
  2. Android BitmapShader 实战 实现圆形、圆
  3. android binder机制之--(我是Server Porxy
  4. IOS与Android的session的存储区别
  5. Android Activity生命周期
  6. Android ListView内存优化
  7. Android studio项目不能编译,提示设备版本
  8. Android数据库代码备忘
  9. Android ndk开发时查看编译器预定义宏
  10. Android : SeekBar 实现图片旋转缩放