如果 A 表的 1 条记录对应 B 表中 N 条记录成立,两表之间就是 1 对多关系;在 1 对多关系中 A 表就是主表,B 表为子表,ForeginKey 字段就建在子表。
如果 B 表的 1 条记录也对应 A 表中 N 条记录,两表之间就是双向 1 对多关系,也称为 多对多关系。
在 orm 中 设置,如果 A 表设置了外键字段 user=models.ForeginKey('UserType') 到 B 表(注意外键表名加引号)
一、查询
利用 orm 获取数据库表中多个数据
获取到的数据类型本质上都是 queryset 类型,类似于列表。
内部有 3 种表现形式(对象、字典、列表)
二、跨表
正向操作
所以表间只要有外键关系就可以一直点下去,所以可以通过 obj.外键.B表 的列表跨表操作,orm 连表操作必须选单个对象。
Foreignkey 字段在哪个表里,那个表里一个 "models" 代表那个表的多个(一行)。
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. 在取的时候跨表
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方式反向跨表:小写表名__字段
obj = UserGroup.objects.all().first()
result = obj.userinfo_set.all() [userinfo对象,userinfo对象,]
#因为使用values取值取得是字典的不是对象,所以需要 小写表名(外键表)__
v = UserGroup.objects.values('id','title')
v = UserGroup.objects.values('id','title','小写的表名称')
v = UserGroup.objects.values('id','title','小写的表名称__age')
v = UserGroup.objects.values_list('id','title')
v = UserGroup.objects.values_list('id','title','小写的表名称')
v = UserGroup.objects.values_list('id','title','小写的表名称__age')