Django基础09篇 表关系多对多、一对一、自关联
1.多对多
表关系的多对多,例如一个老师可以教多个学生,一个学生有多个老师
1.1 创建表结构
多对多在A表添加manytomany字段或者从B表添加,效果一致,最终产生第三张表来实现多对多关联关系,字段取两张表的primary key进行对应
class Teacher(models.Model): name = models.CharField(max_length=50, verbose_name='老师姓名') def __str__(self): return self.name class Meta: db_table = 'teacher' class Student(models.Model): name = models.CharField(max_length=50, verbose_name='学生姓名') teacher = models.ManyToManyField(Teacher, verbose_name='老师') def __str__(self): return self.name class Meta: db_table = 'student'
1.2 新增数据
方法一:传对象形式,无返回值
# 正向查询,models中Student中有多对多关系 # 新增数据,新增多对多关系 #传对象方式,无返回值 stu = models.Student.objects.create(name='王三胖') teacher_obj = models.Teacher.objects.filter(name='李老师').first() # 获取老师对象 teacher_obj2 = models.Teacher.objects.filter(name='王老师').first() # 获取老师对象 stu.teacher.add(teacher_obj, teacher_obj2)
方法二:传对象id,无返回值
# 正向查询,models中Student中有多对多关系 # 新增数据,新增多对多关系 # 传对象id,无返回值 stu = models.Student.objects.create(name='王三金') teacher_obj = models.Teacher.objects.filter(name='李老师').first() # 获取老师对象 teacher_id = teacher_obj.id #获取对象id stu.teacher.add(teacher_id)
1.3 删除
#删除多对多关系,从关联对象集中移除一切对象,删除关联,不会删除对象 teacher_obj.student.clear() #删除指定数据,从关联对象集中移除执行的模型对象 teacher_obj.student.remove(2) #接收主键id teacher_obj.student.remove(student_obj)#接收对象 teacher_obj.student.set([1,2,3,4])#新增,每次都会先删除所有的绑定关系,再新增,比如一个老师去别的班当班主任了
1.4 查询
2.一对一
一对一:子表从母表中选出一条数据一一对应,母表中选出来一条就少一条,子表不可以再选择母表中已被选择的那条数据
3.自关联
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)