django 连表查询,Django ORM中的方法
ORM连表操作
在django学习orm的时候,我们可以把一对多和多对多分为两种方式:正向搜索和反向搜索。
正向查找:ForeignKey在UserInfo表中。如果从UserInfo表开始查询其他表,这是一个正向操作,而如果从UserType表开始查询其他表,这是一个反向操作。
(1)一对多:模型。外键(其他表)
(2)多对多:模型。ManyToManyField(其他表格)
(3)一对一:模特。一对一字段(其他表)
正向连表操作总结:
所谓的正向和反向连接表操作的标识仅由Foreign_Key字段位于哪个表来确定,
Foreign_Key字段可用于连接任何表中的表;否则,将使用与Foreign_Key字段关联的小写表名。
一对多:对象。外键。关联表字段,值(外键字段_ _关联表字段)
多对多:外键字段。全部()
反向连表操作总结:
通过值、值列表和过滤器反转跨表:小写表名_ _关联的表字段
按对象反向跨表:小写surface _set()。全部()
前端ajax要携带的参数
根据前端参数,返回不同的数据库结果。
应用场景:
(1)一对多:在表格中创建一行数据时,有一个单选下拉框(可以重复选择)。
比如创建用户信息时,需要选择一个用户类型【普通用户】【黄金用户】【白金用户】等。
(2)多对多:创建一个表中的一行数据,有一个下拉框,可以多选。
比如创建用户信息,需要为用户指定多个爱好。
(3)一对一:在表格中创建一行数据时,有一个单选的下拉框(下拉框中的内容使用一次后消失。
例如,包含10列数据的原始表保存相关信息。一段时间后,10列不能满足需求,需要在原表中增加5列数据。
1对多
如果表A中的一条记录对应表B中的n条记录,则两个表之间是一对多的关系;在一对多关系中,表A为主表,表B为子表,ForeignKey字段内置在子表中;
如果表B中的一条记录也对应于表A中的N条记录,则两个表之间存在双向一对多关系,也称为多对多关系;
如果外键字段user=models . foreign key( usertype )在表A到表B中设置,则在orm中设置(注意外键表名用引号括起来)
意思是表A中写的表B的主键,(一列),代表表B的倍数(一行)叫做一对多。
查询
摘要:使用orm获取数据库表中的多个数据
获取的数据类型本质上都是queryset类型,
类似于列表,
有三种内部形式(对象、字典和列表)。
Modle.table objects.all()
Modle.table objects.values()
Modle.table objects.values()
跨表
正向操作
所以只要表之间存在外键关系,就可以随时点击。
所以可以通过obj.foreign key.b表的列表进行跨表操作(注意!Orm表连接操作必须选择单个对象,不像SQL中的直接表和表连接)
打印(对象类别标题)
foreignkey字段在该表中,该表中的“空格”表示该表的多个(一行)。
classUserGroup(模型。型号):
第三部门
标题=模型。沙菲
eld(max_length=32)
classUserInfo(models.Model):
"""
员工4
"""
nid=models.BigAutoField(primary_key=True)
user=models.CharField(max_length=32)
password=models.CharField(max_length=64)
age=models.IntegerField(default=1)
#ug_id1
ug=models.ForeignKey("UserGroup",null=True)1. 在取得时候跨表
q = UserInfo.objects.all().first()
q.ug.title
2. 在查的时候就跨表了
UserInfo.objects.values('nid','ug_id')
UserInfo.objects.values('nid','ug_id','ug__title') #注意正向连表是 外键__外键列 反向是小写的表名
3. UserInfo.objects.values_list('nid','ug_id','ug__title')
反向连表:
反向操作无非2种方式:
(1)通过对象的形式反向跨表:小写表面_set().all()
(2)通过value和value_list方式反向跨表:小写表名__字段
1. 小写的表名_set 得到有外键关系的对象
obj = UserGroup.objects.all().first()
result = obj.userinfo_set.all() [userinfo对象,userinfo对象,]
2. 小写的表名 得到有外键关系的列 #因为使用values取值取得是字典的不是对象,所以需要 小写表名(外键表)__
v = UserGroup.objects.values('id','title')
v = UserGroup.objects.values('id','title','小写的表名称')
v = UserGroup.objects.values('id','title','小写的表名称__age')
3. 小写的表名 得到有外键关系的列
v = UserGroup.objects.values_list('id','title')
v = UserGroup.objects.values_list('id','title','小写的表名称')
v = UserGroup.objects.values_list('id','title','小写的表名称__age')
1对多自关联( 由原来的2张表,变成一张表! )
想象有第二张表,关联自己表中的行
相关推荐:《Python视频教程》
代码
classComment(models.Model):
多对多:
1、自己写第3张关系表
ORM多对多查询:
女士表:
男生表:
男女关系表
多对跨表操作
#获取方少伟有染的女孩
多对多关系表 数据查找思路
(1)找到该对象
(2)通过该对象 反向操作 找到第三张关系表
(3)通过第三张关系表 正向操作 找到 和该对象有关系对象
总结
只要对象1和对象2 中间有关系表建立了关系; 对象1反向操作 到关系表 ,关系表正向操作到对象2,反之亦然。
2、第3张关系表不用写(m=models.ManyToManyField(' 要关联的表') 自动生成)
由于 DjangoORM中一个类名对应一张表,要想操作表就modles.类直接操作那张表,但使用ManyToManyField字段生成 “第三张”关系表怎么操作它呢?
答案:通过单个objd对象 间接操作
classBoy(models.Model):
正向操作: obj.m.all()
obj=models.Boy.objects.filter(name='方少伟').first()
反向操作 :obj.小写的表名_set
多对多和外键跨表一样都是 小写的表名_set
3、既自定义第三张关系表 也使用ManyToManyField('Boy')字段(杂交类型)
ManyToManyField()字段创建第3张关系表,可以使用字段跨表查询,但无法直接操作第3张表,
自建第3表关系表可以直接操作,但无法通过字段 查询,我们可以把他们结合起来使用;
作用:
(1)既可以使用字段跨表查询,也可以直接操作第3张关系表
(2)obj.m.all() 只有查询和清空方法
外键反向查找别名(方便反向查找)
在写ForeignKey字段的时候,如果想要在反向查找时不使用默认的 小写的表名_set,就在定义这个字段的时间加related参数!
related_name、related_query_name 字段=什么别名 反向查找时就使用什么别名!
反向查找:
设置了related_query_name 反向查找时就是obj.别名_set.all()保留了_set
related_query_name
related_name
反向查找:
设置了relatedname就是 反向查找时就说 obj.别名.all()
多对多自关联(由原来的3张表,变成只有2张表)
把两张表通过 choices字段合并为一张表
‘第三张关系表’ 使用models.ManyToManyField('Userinfo')生成
特性:
obj = models.UserInfo.objects.filter(id=1).first() 获取对象
(1)查询第三张关系表前面那一列:obj.m
select xx from xx where from_userinfo_id = 1
(2)查询第三张关系表后面那一列:obj.userinfo_set
select xx from xx where to_userinfo_id = 1
多对多自关联特性:
ManyToManyField生成的第三张表
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。