表关联操作及多表查询

image.png
一对多(增删改查)
正向:一个模型中存在外键字段,通过这个模型对外键进行操作就叫正向;
反向:一个模型如果被另个一个模型外键关联,通过这个模型对关联它的模型操作叫反向;
class Student(models.Model):
grade = models.ForeignKey("Grade",on_delete=models.SET_NULL,null=True)
正向增加学生
增加学生:通过班级id对应增加
Student.objects.create(name="Aaron",age=23,QQ="6445379473",phone="13345857594",grade_id=1)
Student.objects.create(name="Bleak",age=23,QQ="539673962",phone="15647557594",grade_id=3)
多对多(增删改查)
学生表与课程表是多对多关系
class Course(models.Model):
name = models.CharField("课程名称",max_length=20)
students = models.ManyToManyField("Student",through="Enroll",related_name="course")#related_name="course"表示将反向模型管理器重新命名
反向模型管理器是:course_set,将course替换course_set
反向增加数据
from students.models import Student,StudentDetail,Grade,Course,Enroll
c1 = Course.objects.create(name="python") #增加一个课程
s1 = Student.objects.first()#选择任意一个学生
e = Enroll() #创建一个空的中间表,用于学生与课程的关联
e.course=c1
e.student=s1 #将学生与课程关联起来
e.save()#保存
查看课程表
select * from students_course;
+----+--------+
| id | name |
+----+--------+
| 1 | python |
+----+--------+
1 row in set (0.00 sec)
查看学生与课程的中间表
select * from students_enroll;
+----+-----+----------------------------+-----------+------------+
| id | pay | c_time | course_id | student_id |
+----+-----+----------------------------+-----------+------------+
| 1 | 0 | 2020-07-01 07:43:56.276152 | 1 | 1 |
+----+-----+----------------------------+-----------+------------+
1 row in set (0.00 sec)
一对一(增删改查)
正向:一对一所在的模型,通过这个模型去访问关联的模型就叫正向;
d1 = StudentDetail(college="北京理工大学") #创建一所学校
d1.student = s1#进行关联
d1.save()#保存
查看学生详情表
select * from students_studentdetail;
+----+--------------------+------------+
| id | college | student_id |
+----+--------------------+------------+
| 1 | 北京理工大学 | 1 |
+----+--------------------+------------+
1 row in set (0.00 sec)