django中关联(一对多)查询的两种方式,理一理
关联查询有两种方式:一种是创建类对象,通过类对象查询。另外一种是通过模型类查询。两种方式单独看没问题,放一起看就混了。这边我来帮大家理一理
首先:一类和多类要理清:在数据库中,一类中的一条记录对应着多类中的多条记录,多类中保存着可以知道每一条记录对应的一类记录是什么 的关联属性。
第一种方式:类对象查询(属性以id为例),这个比较好理解,你就看哪个类有关联属性就完了
①. 知道一类的id,去查询对应的多类的信息:
创建一类的对象, 一类对象.多类类名小写_set.all()
②.知道多类的id,去查询对应的一类的信息:
创建多类的对象, 多类对象.关联属性
第二种方式:模型类查询(属性以id为例)
①.知道一类的id,去查询对应的多类的信息:
多类类名.objects.filter(多类中的关联属性__id=值)
②.知道多类的id,去查询对应的一类的信息:
一类类名.objects.filter(多类类名小写__id=1)
由于模型类查询的方法用的filter,在关联的同时还能加上条件判断,因此工作中基本都是用这种方法。
下面是加上条件判断的模型类查询公式:
(一个英雄有多个技能,每个英雄技能都不一样,英雄类名HeroInfo,技能类名SkiInfo,技能中关联英雄的属性s_hero)
①.查询多类信息,对应的一类信息有一个条件判断:
多类类名.objects.filter(多类中的关联属性__一类属性名__条件),例如:查询技能信息,要求英雄的名字中有‘德玛’, SkiInfo.objects.filter(s_hero__hname__contains='德玛')
②.查询一类信息,对应的多类中有一个条件判断:
一类类名.objects.filter(多类类名小写__多类属性名__条件),例如:查询英雄信息,要求技能id小于5 HeroInfo.objects.filter(skiinfo__id__lt=5)
最后对模型类查询来个小总结:
1.想查询哪个类中的信息,就以哪个类名.object.filter开头
2.多类类名开头,filter括号内 关联属性开头。一类类名开头,fulter括号内 多类类名小写开头。后面都是条件判断(如上面的一类有条件判断或多类有条件判断)