前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django进阶-7-ORM一对多

Django进阶-7-ORM一对多

作者头像
小团子
发布2019-07-18 16:02:17
5620
发布2019-07-18 16:02:17
举报
文章被收录于专栏:数据云团数据云团

如果 A 表的 1 条记录对应 B 表中 N 条记录成立,两表之间就是 1 对多关系;在 1 对多关系中 A 表就是主表,B 表为子表,ForeginKey 字段就建在子表。

如果 B 表的 1 条记录也对应 A 表中 N 条记录,两表之间就是双向 1 对多关系,也称为 多对多关系。

在 orm 中 设置,如果 A 表设置了外键字段 user=models.ForeginKey('UserType') 到 B 表(注意外键表名加引号)

一、查询

利用 orm 获取数据库表中多个数据

获取到的数据类型本质上都是 queryset 类型,类似于列表。

内部有 3 种表现形式(对象、字典、列表)

  • model.表名.objects.all()
  • model.表名.objects.values()
  • model.表名.objects.values()

二、跨表

正向操作

所以表间只要有外键关系就可以一直点下去,所以可以通过 obj.外键.B表 的列表跨表操作,orm 连表操作必须选单个对象。

Foreignkey 字段在哪个表里,那个表里一个 "models" 代表那个表的多个(一行)。

代码语言:javascript
复制
class UserGroup(models.Model):
    # 部门 
    title = models.CharField(max_length=32)

class UserInfo(models.Model):
    # 员工
    nid = models.BigAutoField(primary_key=True)
    user = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField(default=1)
    # ug_id 1
    ug = models.ForeignKey("UserGroup",null=True)

1. 在取的时候跨表

代码语言:javascript
复制
q = UserInfo.objects.all().first()
q.ug.title

2. 在查的时候就跨表

#注意正向连表是 外键__外键列 反向是小写的表名

代码语言:javascript
复制
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方式反向跨表:小写表名__字段

  • 小写的表名_set 得到有外键关系的对象
代码语言:javascript
复制
obj = UserGroup.objects.all().first()
result = obj.userinfo_set.all() [userinfo对象,userinfo对象,]
  • 小写的表名 得到有外键关系的列

#因为使用values取值取得是字典的不是对象,所以需要 小写表名(外键表)__

代码语言:javascript
复制
v = UserGroup.objects.values('id','title') 
v = UserGroup.objects.values('id','title','小写的表名称') 
v = UserGroup.objects.values('id','title','小写的表名称__age') 
  • 小写的表名 得到有外键关系的列
代码语言:javascript
复制
v = UserGroup.objects.values_list('id','title') 
v = UserGroup.objects.values_list('id','title','小写的表名称') 
v = UserGroup.objects.values_list('id','title','小写的表名称__age')
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档