models之间的关系简单的分为一对一(OneToOneField),一对多(ForeignKey),多对多(ManyToManyField)三种
构建这种关系相对简单,只需要在models中声明即可,主要是在调用和查询的时候有些困难,所以这里主要说说查询相关
查询和引用一般是在视图函数views中实现
1.全部展示
from apps.model import AbsModel def index(request): abs=AbsModel.objects.all()
2.根据条件查询,一般是id,而id大多是由前端传过来的,通过request请求获取到id
from apps.model import AbsModel def index(request): abs=AbsModel.objects.get(id=id)
3.根据主表信息获取从表内容
这里假设AModel是主表,BModel是从表,已经获取到了主表的name=‘张三’信息,如何获取从表中name对应的详细信息呢
#先获取name=张三这条信息的数据 a=AModel.object.get(name='zhangsan') #然后根据a.id获取b表的内容 res=BModel.object.get(a_id=a.id)
4.根据从表信息获得主表内容
这里假设AModel是主表,BModel是从表,已经获取到了从表的name=‘张三’信息,如何获取主表中班级对应的详细信息呢
#首先根据name信息获取从表数据 b1=BMolde.object.get(name='zhangsan') #获取主表的name属性 aname=b1.amodel.aname
b1.amodel是一个objects对象
4.1.获取相同信息
res=BModel.object.filter(aname=b1.aname)
这里设置了在从表BModel中的条件,也就是aname=b1.aname。而b1是根据name获得的
4.2.获取从表的所有信息
#首先根据name信息获取从表数据 b1=BMolde.object.get(name='zhangsan') #amodel.bmodel_set a表对应的b表集合 res=b1.amodel.bmodel_set.all()
5.根据主表信息找从表信息
#先根据已知信息获得信息所在的主表信息 a1=AModel.object.get(name='zhangsan') 再根据外键获得从表的信息 res=BMoldel.object.fieter(aname=a1)
也可以写成
#先根据已知信息获得信息所在的主表信息 a1=AModel.object.get(name='zhangsan') 再根据外键获得从表的信息 res=a1.bmodel_set.all()当然这里获取到的都是从表的完整信息,也可以进行筛选,比如在
res=a1.bmodel_set.all()
这里,all()也可以需求改为filter或者get
删除的时候要先删除从表,再删除主表
使用
BModel.objects.get(name='zhangsan').delete()