django 连表查询,Django ORM中的方法

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: