关系型数据库的关系包括三种类型:
ForeignKey:一对多,将字段定义在多的一端中。
ManyToManyField:多对多,将字段定义在任意一端中。
OneToOneField:一对一,将字段定义在任意一端中。
可以维护递归的关联关系,使用'self'指定,详见"自关联"。
一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。
一对多关系示例:一个学生只属于一个班,但是一个学院有多名学生。
多对多关系示例:一个学生可以选择多门课,一门课也有多名学生。区别在于我们写一对多关系的时候 我们把外键 在多那一方; 多对多关系 : 外键关系 -----两边都行
关联查询
Django中也能实现类似于join查询。
通过对象执行关联查询
在定义模型类时,可以指定三种关联关系,最常用的是一对多关系,如本例中的"图书-人物"就为一对多关系
进入shell练习关系的查询
python manage.py shell
由一到多的访问语法
一对应的模型类对象.多对应的模型类名小写_set
例: b = BookInfo.objects.get(id=1)b.heroinfo_set.all()
由多到一的访问语法
多对应的模型类对象.多对应的模型类中的关系类属性名
例:h = HeroInfo.objects.get(id=1)h.hbook
访问一对应的模型类关联对象的id语法
多对应的模型类对象.关联类属性_id
例: h = HeroInfo.objects.get(id=1)h.book_id
例:查询编号为1的图书。
book=BookInfo.objects.get(pk=1)
例:获得book图书的所有英雄。
book.heroinfo_set.all()
例:获得编号为1的英雄。
hero=HeroInfo.objects.get(pk=1)
例:获得hero英雄出自的图书。
hero.hbook


由多模型类条件查询一模型类数据
语法如下:
关联模型类名小写__属性名__条件运算符=值
如果没有"__运算符"部分,表示等于,结果和sql中的inner join相同。
例:查询图书,要求图书中英雄的描述包含'八'。
list = BookInfo.objects.filter(heroinfo__hcontent__contains='八')
由一模型类条件查询多模型类数据
语法如下:
一模型类关联属性名__一模型类属性名__条件运算符=值
例:查询书名为“天龙八部”的所有英雄。
list = HeroInfo.objects.filter(hbook__btitle='天龙八部')