这篇文章运用简单易懂的例子给大家介绍Django中怎么操作ORM连表,代码非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
ORM连表操作
我们在学习django中的orm的时候,我们可以把一对多,多对多,分为正向和反向查找两种方式。
正向查找:ForeignKey在 UserInfo表中,如果从UserInfo表开始向其他的表进行查询,这个就是正向操作,反之如果从UserType表去查询其他的表这个就是反向操作。
(1)一对多:models.ForeignKey(其他表)
(2)多对多:models.ManyToManyField(其他表)
(3)一对一:models.OneToOneField(其他表)
正向连表操作总结:
所谓正、反向连表操作的认定无非是Foreign_Key字段在哪张表决定的,
Foreign_Key字段在哪张表就可以哪张表使用Foreign_Key字段连表,反之没有Foreign_Key字段就使用与其关联的小写表名;
1对多:对象.外键.关联表字段,values(外键字段__关联表字段)
多对多:外键字段.all()
反向连表操作总结:
通过value、value_list、fifter 方式反向跨表:小写表名__关联表字段
通过对象的形式反向跨表:小写表面_set().all()
前端ajax需要携带的参数
根据前端参数,返回不同数据库结果
应用场景:
(1)一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
(2)多对多:在某表中创建一行数据是,有一个可以多选的下拉框。
例如:创建用户信息,需要为用户指定多个爱好。
(3)一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了。
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据。
1对多
如果A表的1条记录对应B表中N条记录成立,两表之间就是1对多关系;在1对多关系中 A表就是主表,B表为子表,ForeignKey字段就建在子表;
如果B表的1条记录也对应A表中N条记录,两表之间就是双向1对多关系,也称为多对多关系;
在orm中设置如果 A表设置了外键字段user=models.ForeignKey('UserType')到B表(注意外键表名加引号)
就意味着 写在写A表的B表主键, (一列),代表B表的多个(一行)称为1对多,
查询
总结:利用orm获取 数据库表中多个数据
获取到的数据类型本质上都是 queryset类型,
类似于列表,
内部有3种表现形式(对象,字典,列表)
modle.表名.objects.all()
modle.表名.objects.values()
modle.表名.objects.values()
跨表
正操作
所以表间只要有外键关系就可以一直点下去。
所以可以通过obj.外键.B表的列表跨表操作(注意!!orm连表操作必须选拿单个对象,不像SQL中直接表和表join就可以了)
print(obj.cls.title)
foreignkey字段在那个表里,那个表里一个"空格"代表那个表的多个(一行)
class UserGroup(models.Model): ,,,,,,,,,,,,,, ,,,,,,,,,,,部门,3 ,,,,,,,,,,,,,, ,,,,,,,,,,,title =, models.CharField (max_length=32) ,,,,,,,class 用户信息(models.Model): ,,,,,,,,,,,,,, ,,,,,,,,,,,员工4 ,,,,,,,,,,,,,, ,,,,,,,,,,,nid =, models.BigAutoField (primary_key=True) ,,,,,,,,,,,user =, models.CharField (max_length=32) ,,,,,,,,,,,password =, models.CharField (max_length=64) ,,,,,,,,,,,age =, models.IntegerField(默认=1) ,,,,,,,,,,,#,ug_id 1 ,,,,,,,,,,,ug =, models.ForeignKey (“UserGroup", null=True)
1。在取得时候跨表
=UserInfo.objects.all()中国当代()
q.ug.title
2。在查的时候就跨表了,
UserInfo.objects.values (& # 39; nid& # 39; & # 39; ug_id& # 39;),
UserInfo.objects.values (& # 39; nid& # 39; & # 39; ug_id& # 39;, & # 39; ug__title& # 39;),,#注意正向连表是,外键__外键列反向是小写的表名
3。UserInfo.objects.values_list (& # 39; nid& # 39;, & # 39; ug_id& # 39;, & # 39; ug__title& # 39;)
<强>反向连表:强>
<强>反向操作无非2种方式: