关联添加和查询

多对多增删改查

  • 添加

    # 案例,给某个人添加课程 操作第三张表
      
        stu = Student.objects.get(name="张三") #  首先给哪个人添加课程查出来,他会返回一个模型类对象
        c1 = Course.objects.get(title="python") # 将要插入的数据查出来
        c2 = Course.objects.get(title="sql")# 将要插入的数据查出来
        stu.courses.add(c1,c2) # 添加courses 是在Student这个模型类里面创建多对多关系的时候变量 只要是拿到Student对象就可以添加
    
      # 方式2
    
      stu = Student.objects.get(name="李四")
      stu.courses.add(4,5) # 直接写要添加的ID也可以stu.courses.add(*[4,5])
      
    
  • 删除

    # 删除多个可以使用*[] 和添加相同
        stu = Student.objects.get(name="张三") 
        stu.courses.remove(2) # 删除
        # 清除 会将wangwyu 的第三张表的关联数据全部删除
        stu = Student.objects.get(name="wangwyu")
        stu.courses.clear()
    
  • 重置

    # 会将之前的第三张表的数据全部删除
    
      stu = Student.objects.get(name="张三")
      stu.courses.set([1,2,3]) # set 他会将之前的对应数据删除 将这次传入的数据更新进去
    
    
    • 正向查询
          stu = Student.objects.get(name="张三") 
          for x in stu.courses.all(): # 返回一个query set对象 里面嵌套关联表的模型对象
              print(x.title)
      
      
    • 反向查询
          cla = Course.objects.get(title="近代史")
          ret = cla.student_set.all()  # student_set 是表名加上_set _set是固定的 只要是可以查出多个的时候都要加set  也可以使用 related_name
          print(ret)
      

关联查询

下面这两种方式都分为正向查询和反向查询,正向查询就是通过关联属性查询 反过来就叫反向查询,反向查询依赖表名_set,_set是固定写法 必须在表名后面加上_set 或者是related_name,一对多会拼上_set 一对反向查询不会拼_set

基于对象的查询

  • 正向查询
        stu = Student.objects.get(name="张三") # 首先去查某个数据 他会返回模型类对象
        print(stu.clas.name) # clas 是模型里面做关联的那个变量对象也可以说是clas的模型对象
    
  • 反向查询
    • 依赖表名反向查询
          cla = Clas.objects.get(name="语文")
          ret = cla.student_set.all()  # 返回一个query set集合对象 表名小写(也就是模型类名)后面固定加上_set,一对一反向查询不会加_set
          print(ret)
      
    • 通过related_name
        # .ForeignKey(elated_name="student_list") 在模型类绑定的时候在ForeignKey中加上related_name值随便起 在查的时候就可以使用返回的模型类对象.related_name的名称进行查询了
      
          cla = Clas.objects.get(name="计算机科学与应用1班") 
          ret = cla.student_list.all() # 反向查询 返回一个query set集合 里面嵌套模型类对象
          print(ret)
      

基于双下划线的查询join

  • 一对多

    • 正向跨表查询

          # 将Student作为基表
          stu = Student.objects.filter(age__gt=22).values("name","clas__name") # clas__name clas是要跨表查询的对象名称 就是绑定时候的变量名称__后面就是要去的字段名称
          print(stu)
      
    • 反向跨表查询

          # 将Clas作为基表student_list是related_name名后面就是要根据哪个字段过滤和过滤条件 
        stu = Clas.objects.filter(student_list__age__gt=22).values("name","student_list__name")  # values("name","student_list__name")  获取Clas的那么以及 student_list的name
        print(stu)
      
      
  • 多对多

    • 正向跨表查询

          # 将Student作为基表 查询张三学了那些课程
          stu = Student.objects.filter(name="张三").values("name","courses__title") #  courses 是绑定多对多的对象名
          print(stu)
      
    • 反向跨表查询

          # 将Course作为基表 查询那些学生在学python
          stu = Course.objects.filter(title="python").values("title","stu__name")
          print(stu)
      
      
  • 一对一

    • 正向跨表查询

          # 将Student作为基表 查询张三的手机号
          stu = Student.objects.filter(name="张三").values("name","stu_detail__tel")
          print(stu)
      
    • 反向跨表查询

          # 将Course作为基表 查询13555555这个手机号是谁的
        stu = StudentDetail.objects.filter(tel="13555555").values("tel","stu_detail__name")
        print(stu)
      
      

连续跨表查询

    stu = StudentDetail.objects.filter(tel="110").values("stu_detail__name","stu_detail__clas__name")
    print(stu)

分组查询

posted @ 2022-12-04 21:18  zhq9  阅读(44)  评论(0编辑  收藏  举报