清秋2018

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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.自关联

posted on   清秋2018  阅读(272)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示