Python Day 59 Django框架、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)
    class Meta:
    #联合唯一索引
        unique_together = [
            ('stu','teac'),            
    ]

   ##增删改查操作

# 增  直接通过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)

猜你喜欢

转载自www.cnblogs.com/liangzhenghong/p/11202207.html