多对多表的操作

一、关于多对多的认识

在我们学习MySQL的时候学习到多表对多表的时候讲到需要创建一个第三张表来关联两张表

django中创建多对多的关系的时候有两种方法:

  • 1、手动创建一个第三张表(利用前一章节的知识,一对多的关系)
  • 2、在model中使用ManyToManyField()来创建两张表多对多关系

常见的多对多关系情况有:老师->班级, 博客->标签

二、创建多对多的关系(直接使用ManyToManyField())

  • 1、创建老师表模型

    class TeacherModel(models.Model):
        teacher_name = models.CharField(max_length=100, blank=True, null=True, verbose_name='老师名字')
        teacher_age = models.IntegerField(blank=True, null=True, verbose_name='老师年龄')
    
        def __str__(self):
            return self.teacher_name
    
  • 2、创建班级表模型并使用ManyToManyField()来关联

    class ClassModel(models.Model):
        class_name = models.CharField(max_length=100, blank=True, null=True, verbose_name='班级名称')
        teacher = models.ManyToManyField('TeacherModel')
    
        def __str__(self):
            return self.class_name
    
  • 3、运行命令生成表

  • 4、查看表,所谓的中间表(app01_classmodel_teacher)

    mysql> show tables;
    +----------------------------+
    | Tables_in_django_test      |
    +----------------------------+
    | app01_classmodel           |
    | app01_classmodel_teacher   |
    | app01_studentmodel         |
    | app01_teachermodel         |
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    | school                     |
    +----------------------------+
    15 rows in set (0.00 sec)
    
    mysql>
    
  • 5、补充说明,关于ManyToManyField在哪个模型都可以,没特别的要求

三、关于多对多的数据操作

  • 1、两张表单独自己创建自己的数据
  • 2、我们要操作的是第三张表,对前面两张表进行关联

四、关于多对多新增数据

  • 1、主表中使用add(*列表)

    def test(request):
        # 获取id=2的班级
        class_result = ClassModel.objects.get(id=2)
        # 获取全部的老师
        teacher_result = TeacherModel.objects.all()
        # 刚刚创建的模型中班级关联老师
        class_result.teacher.add(*teacher_result)
        return HttpResponse('ok')
    
  • 2、直接添加对象

    def test(request):
        class_result = ClassModel.objects.get(id=1)
        # 获取全部的老师
        teacher_result = TeacherModel.objects.all().first()
        # 刚刚创建的模型中班级关联老师
        class_result.teacher.add(teacher_result)
        return HttpResponse('ok')
    

五、删除数据

  • 1、指定删除id=1

    def test(request):
        # 获取id=2的班级
        class_result = ClassModel.objects.get(id=2)
        # 1表示要删除第三种表中老师id=1的
        class_result.teacher.remove(1)
        return HttpResponse('ok')
    
  • 2、批量删除

    def test(request):
        # 获取id=2的班级
        class_result = ClassModel.objects.get(id=2)
        # 获取全部的老师
        teacher_result = TeacherModel.objects.all()
        class_result.teacher.remove(*teacher_result)
        return HttpResponse('ok')
    
  • 3、直接使用clear()清除关联关系

    def test(request):
          # 获取id=2的班级
          class_result = ClassModel.objects.get(id=2)
          # 获取全部的老师
          teacher_result = TeacherModel.objects.all()
          class_result.teacher.clear()
          return HttpResponse('ok')
    

六、修改数据

  • 1、使用set方法

    def test(request):
          # 获取id=2的班级
          class_result = ClassModel.objects.get(id=2)
          # 获取全部的老师
          teacher_result = TeacherModel.objects.all()
          class_result.teacher.set(*teacher_result)
          return HttpResponse('ok')
    

七、查询数据

  • 1、正向查询

    def test(request):
        # 获取id=2的班级
        class_result = ClassModel.objects.get(id=2)
        result = class_result.teacher.all()
        print(result)
        return HttpResponse('ok')
    
  • 2、使用双下划线进行正向查询

    def test(request):
        result = ClassModel.objects.filter(class_name='2班').values('class_name', 'teacher__teacher_name')
        print(result)
        return HttpResponse('ok')
    
  • 3、反向查找(跟一对多一样的会自动创建一个模型小写_set的属性)

    def test(request):
        teacher_result = TeacherModel.objects.get(pk=1)
        re = teacher_result.classmodel_set.all().values('class_name')
        print(re)
        return HttpResponse('ok')
    

results matching ""

    No results matching ""