一、关系表的数据操作
1. 关系表的数据操作,查看数据库中的表结构
2. 一对多关系数据的添加
① 第一中方式就是跟之前一样,用传参的方式添加,需要注意的是外键的值必须是关联表中已经存在的值
② 第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象
二、 表关联对象的访问
表关联对象的访问
Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个。
处理关联对象的一些方法
add(obj1, obj2, ... )添加的已经存在数据库的数据,添加——指定的模型对象到关联的对象集中。
create(**kwargs) 添加不存在的数据,将数据直接存入数据库
创建一个新的对象,将它保存并放在关联的对象集返回新创建的对象
remove(obj1, obj2, ... )
从关联的对象集中删除指定的模型对象。删除的是关系表中的数据。
dear() 从关联的对象集中删除所有的对象
注:对于所有类型的关联字段,add()、create()、remove()、clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。
三、 多表查询
案例:仅提供app中models.py以及views.py代码,其他代码参考前期内容!
models.py
from django.db import models # 学院表 class Department(models.Model): d_id = models.AutoField(primary_key=True) d_name = models.CharField(max_length=20, unique=True) def __str__(self): return f'd_id={self.d_id}, d_name={self.d_name}' # 学生表 class Students(models.Model): s_id = models.AutoField(primary_key=True) s_name = models.CharField(max_length=20) # d_id为外键且不唯一,需要建立与Department表的一对多关系 d_id = models.ForeignKey('Department', on_delete=models.SET_NULL, null=True) # models.SET_NULL 表示在所关联的表对应的信息被删除后,此处信息可以变更为null def __str__(self): return f's_id={self.s_id}, s_name={self.s_name}' # 学生详情表 class Stu_detail(models.Model): sd_id = models.AutoField(primary_key=True) sd_sex = models.BooleanField(default=1) sd_age = models.IntegerField() intro = models.TextField(null=True) # 学生介绍信息,可为空 # s_id为外键且唯一,需要建立与Students表的一对一关系 s_id = models.OneToOneField('Students', on_delete=models.CASCADE, unique=1) def __str__(self): return f'sd_id={self.sd_id}, sd_sex={self.sd_sex}, sd_age={self.sd_age}' # 课程详情表 class Course(models.Model): c_id = models.AutoField(primary_key=True) c_name = models.CharField(max_length=20, unique=True) # c_id为外键且唯一,在与Students表存在多对多关系 s_id = models.ManyToManyField('Students') def __str__(self): return f'c_id={self.c_id}, c_name={self.c_name}'
views.py
from django.shortcuts import render from django.http import HttpResponse from .models import Department, Students, Stu_detail, Course def add(request): # # 学院表添加 # Department.objects.get_or_create(d_name="理学院") # Department.objects.get_or_create(d_name="计算机学院") # Department.objects.get_or_create(d_name="医学院") # Department.objects.get_or_create(d_name="法学院") # # # 学生表 # Students.objects.get_or_create(s_name='zl', d_id_id=1) #此处关联d_id需要确认数据库中对应的具体id的格式 # Students.objects.get_or_create(s_name='bd', d_id_id=1) # Students.objects.get_or_create(s_name='dd', d_id_id=3) # Students.objects.get_or_create(s_name='yh', d_id_id=2) # # # 学生详情表 # Stu_detail.objects.get_or_create(sd_sex=1, sd_age=18, s_id_id=1) # Stu_detail.objects.get_or_create(sd_sex=1, sd_age=19, s_id_id=2) # Stu_detail.objects.get_or_create(sd_sex=0, sd_age=18, s_id_id=3) # Stu_detail.objects.get_or_create(sd_sex=0, sd_age=23, s_id_id=4) # # # 课程表 # Course.objects.get_or_create(c_name='python') # Course.objects.get_or_create(c_name='java') # Course.objects.get_or_create(c_name='c++') # Course.objects.get_or_create(c_name='mysql') # # 选课表,学生与课程表关联表 # # 首先获取信息 # c1 = Course.objects.get(c_id=1) # 课程信息 # c2 = Course.objects.get(c_id=2) # c3 = Course.objects.get(c_id=3) # c4 = Course.objects.get(c_id=4) # # s1 = Students.objects.get(s_id=1) # 学生信息 # s2 = Students.objects.get(s_id=2) # s3 = Students.objects.get(s_id=3) # s4 = Students.objects.get(s_id=4) # # # 正向与方向访问 # # 给学生分配课程 是反向访问 课程表的名字(小写)_set.add(xx,yy)添加 # s1.course_set.add(c1, c4) # s2.course_set.add(c2) # s4.course_set.add(c2) # # 如果是给课程分配学生的话,则为正向访问,采用课表名.关联名.add(xx,yy)添加 # c2.s_id.add(s2, s4) # c1.s_id.add(s1) # c4.s_id.add(s1) return HttpResponse("数据添加成功!") def query(request): # 学院表 d1 = Department.objects.get(d_id=1) d2 = Department.objects.get(d_id=2) d3 = Department.objects.get(d_id=3) d4 = Department.objects.get(d_id=4) # 学生表 s1 = Students.objects.get(s_id=1) s2 = Students.objects.get(s_id=2) s3 = Students.objects.get(s_id=3) s4 = Students.objects.get(s_id=4) # 学生详情表 sd1 = Stu_detail.objects.get(sd_id=1) sd2 = Stu_detail.objects.get(sd_id=2) sd3 = Stu_detail.objects.get(sd_id=3) sd4 = Stu_detail.objects.get(sd_id=4) # 课程表 c1 = Course.objects.get(c_id=1) c2 = Course.objects.get(c_id=2) c3 = Course.objects.get(c_id=3) c4 = Course.objects.get(c_id=4) # 学院表与学生表 一对多关系查询 # 正向访问 由学生表信息获取zl所在的学院信息 zl_d = s1.d_id.d_name print(zl_d) # 反向访问 由学院信息获取d1学院所有的学生信息 d1_s = d1.students_set.all() print(d1_s) # 学生表与学生详情表 一对一关系查询 sd1_s = sd1.s_id.s_name # 正向查询,由学生详情表查询对应学生表信息 print(sd1_s) zl_sd = s1.stu_detail.intro # 反向查询 由学生信息查询对应学生详情表信息,此处因为为一对一关系表,过stu_detail后不需要添加_set print(zl_sd) # 学生表与课程表 多对多关系查询 print(s1.course_set.all()) # 反向查询 print(c2.s_id.all()) # 正向访问 return HttpResponse("OK!") def remove(request): # 学院表 d1 = Department.objects.get(d_id=1) d2 = Department.objects.get(d_id=2) d3 = Department.objects.get(d_id=3) d4 = Department.objects.get(d_id=4) # 学生表 s1 = Students.objects.get(s_id=1) s2 = Students.objects.get(s_id=2) s3 = Students.objects.get(s_id=3) s4 = Students.objects.get(s_id=4) # 学生详情表 sd1 = Stu_detail.objects.get(sd_id=1) sd2 = Stu_detail.objects.get(sd_id=2) sd3 = Stu_detail.objects.get(sd_id=3) sd4 = Stu_detail.objects.get(sd_id=4) # 课程表 c1 = Course.objects.get(c_id=1) c2 = Course.objects.get(c_id=2) c3 = Course.objects.get(c_id=3) c4 = Course.objects.get(c_id=4) s1.course_set.remove(c1) # 反向访问,通过学生表s1删除课程表c1课程,仅删除课程不删除学生信息 s1.course_set.clear() # 反向访问,通过学生表s1删除其所有课程,仅删除课程不删除学生信息 c2.s_id.clear() # 正向 通过c2课程信息删除所有学习了c2课程的学生信息,仅删除课程不删除学生信息 return HttpResponse("删除成功!") def update(request): # 学院表 d1 = Department.objects.get(d_id=1) d2 = Department.objects.get(d_id=2) d3 = Department.objects.get(d_id=3) d4 = Department.objects.get(d_id=4) # 学生表 s1 = Students.objects.get(s_id=1) s2 = Students.objects.get(s_id=2) s3 = Students.objects.get(s_id=3) s4 = Students.objects.get(s_id=4) # 学生详情表 sd1 = Stu_detail.objects.get(sd_id=1) sd2 = Stu_detail.objects.get(sd_id=2) sd3 = Stu_detail.objects.get(sd_id=3) sd4 = Stu_detail.objects.get(sd_id=4) # 课程表 c1 = Course.objects.get(c_id=1) c2 = Course.objects.get(c_id=2) c3 = Course.objects.get(c_id=3) c4 = Course.objects.get(c_id=4) d2.students_set.add(s1) # 反向修改 将s1学生修改为d2学院 return HttpResponse("修改成功!") def find(request): # 查询计算机学院的学生信息 Students.objects.filter(d_id__d_name='计算机学院') # 通过关联d_id以"__"拼接d_name查询对应学院的学信信息 # 查询zl所在的学院信息 Department.objects.filter(students__s_name='zl') # 学院表反向访问学生表 # 查询理学院并且报名了web课程的学生信息 Students.objects.filter(d_id__d_name="理学院", course__c_name='web') # 先正向再方向查询 # 查询理学院并且报名了web课程的学生详情信息 Stu_detail.objects.filter(s_id__d_id__d_name='理学院', s_id__course__c_name='web')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理