zoukankan      html  css  js  c++  java
  • Django中ORM多对多表的操作

    自己创建第三张表建立多对多关系

    表的创建

    # 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联
    
    class Student(models.Model):
        name = models.CharField(max_length=32, null=True)
        age = models.CharField(max_length=32, null=True)
    
    class Teacher(models.Model):
        name = models.CharField(max_length=32, null=True)
        gender = models.CharField(max_length=32, null=True)
    
    # 建立第三张表,把前两张表关联起来
    class TeacherToStudent(models.Model):
        stu = models.ForeignKey('Student', null=True)
        teac = models.ForeignKey('Teacher', null=True)

    增删改查的操作

    # 增  直接通过models.类名.objects.create进行添加
    models.Student.objects.create(name="xxx",age=12)
    models.Teacher.objects.create(name="ooo",gender="")
    models.TeacherToStudent.objects.create(stu_id=1, teac_id=1)
    
    # 删  找出对象.delete()  ,并且把对应关系也删了
    models.Teacher.objects.filter(id=4).delete()
    models.TeacherToStudent.objects.filter(teac_id=4).delete()
    
    # 改 一样不同的表分开操作
    models.Teacher.objects.filter(id=3).update(name="xoxo")
    
    # 查  ,如果我想查询一个学生同时被多少个老师教,有图下三种方法
    # 1:
    res = models.Student.objects.filter(id=2).all()   # 先查出符合条件的学生
    for row in res:
        print(row.name)
        r = row.teachertostudent_set.all()  # (反查)表示第三张表中所有学生id为2的行
        for i in r:
            # i.teac    # (正查)表示对应的老师表里的一列
            print(i.teac.name)   # 查出学生id为2对应的所有老师
    
    # 2:
    res = models.TeacherToStudent.objects.filter(stu__name="cao").all()
    # 查出来的是学生名字为cao对应的所有的行(神奇的双下划线)
    for row in res:
        print(row.stu.name, row.teac.name)  # 找到学生和老师的对应关系
    
    # 3:
    res = models.TeacherToStudent.objects.filter(stu__name="li").values("teac__name")
    # 查出来的QuerySet 列表,里面包含字典
    print(res)

    Django中方法创建多对多关系

    表的创建

    # 表的创建,创建一个班级和课程的多对多关系
    # 通过django中的ManyToManyField创建多对多关系,字段放在两个列中任意一个都可以
    class Classes(models.Model):
        name = models.CharField(max_length=32, null=True)
        course = models.ManyToManyField('Course')
        
    class Course(models.Model):
        name = models.CharField(max_length=32, null=True)

    增删改查的操作

    # 增 先要找到对应的班级或者课程对象
    obj = models.Classes.objects.filter(id=4).first()
    # 找到之后通过建表时的course.add进行添加,要把课程id放在列表里打散传进去
    obj.course.add(1)   # 增加一个
    obj.course.add(*[2,3])    # 增加多个
    
    # 删 找到对象.建表时的属性名.clear() 删除所有
    obj = models.Classes.objects.filter(id=4).first()
    obj.course.clear()
    
    # 重置(改),也是找到对象,通过.set()方法,里面放一个列表
    obj = models.Classes.objects.filter(id=3).first()
    obj.course.set([1,2,3])
    
    # 查 对于模型类中有ManyToManyField字段的表来说
    res = models.Classes.objects.all()  # 先查出所有的对象
    for row in res:
        print(row.name)
        for i in row.course.all():  # row.course.all()就是每个班级对应的所有课程对象
            print(i.name)
    #对于模型类中没有ManyToManyField字段的表来说
    res = models.Course.objects.all()   # 也是先查出所有的对象
    for row in res:
        print("===================")
        print(row.name)
        for i in row.classes_set.all(): # 每个学科对应的所有班级
            print(i.name)

    注:这两种方法建立多对多关系都是可以的,分情况考虑用哪一个,如果表之间的关系简单,

      第三张表中不需要加入除两张表id以外的字段可以用django创建但是如果表关系比较复杂,

      并且,第三张表中还需要加入一些其他的字段,就需要用到我们自定义的多对多关系(

      手动创建第三张表),可以自定制第三张表的结构

  • 相关阅读:
    (DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device【转】
    Linux 内核虚拟地址到物理地址转换讨论【转】
    【Go命令教程】6. go doc 与 godoc
    【Go命令教程】5. go clean
    【Go命令教程】4. go get
    PHP项目收藏
    【Go命令教程】3. go install
    分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验
    【Go命令教程】2. go build
    【Go命令教程】1. 标准命令详解
  • 原文地址:https://www.cnblogs.com/hesujian/p/11196247.html
Copyright © 2011-2022 走看看