清秋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  阅读(273)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示