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创建但是如果表关系比较复杂,

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

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

  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/hesujian/p/11196247.html
Copyright © 2011-2022 走看看