Django模型
表关联对象
#一对多
d1 = Department.objects.get(d_id=3) #学院实例对象
s1 = Student.objects.get(s_id=1) #学生实例
print(s1.department.d_name) #通过学生找到所属学院
通过related_name重命名 student_set
print(d1.student.all()) #通过学院查找学生 可以叫反向查询
#一对一
std = Stu_detail.objects.create(age=18,gender=0,city='changsha',student_id=1)
std = Stu_detail.objects.get(id=1) #一个学生的详细信息
print(std.student.s_name) #正向
print(s1.stu_detail) #反向查
#多对多
s3 = Student.objects.get(s_id=3) #学生实例
c1 = Course.objects.get(c_id=1) #课程实例
print(c1.student.all()) #正向查询
print(s3.course_set.all()) #反向查询
处理关联对象的其它方法
add(obj1, obj2, ...)
添加的已经存在数据库的数据
添加一指定的模型对象到关联的对象集中。(一对多,多对多)
>>> d1 = Department.objects.get(d_id=4)
>>> d1
<Department: Department<d_id=4,d_name=AA>>
>>> st = Student.objects.get(s_id=6)
>>> st
<Student: Student<s_id=6,s_name=xx>>
>>> d1.student.add(st)
>>> c1 = Course.objects.get(c_id=2)
>>> st.course.add(c1)
create(**kwargs)
添加不存在的数据 ,将数据直接存入数据库
创建一个新的对象,将它保存并放在关联的对象集中。返回新创建的对象。(一对多,多对多)
>>> st
<Student: Student<s_id=6,s_name=xx>>
>>> st.course.create(c_name='c++')
<Course: Course<c_id=3,c_name=c++>>
>>> st.course.all()
<QuerySet [<Course: Course<c_id=3,c_name=c++>>]>
remove(obj1, obj2, ...)
从关联的对象集中删除指定的模型对象。(多对多) 删除的是关系表中的数据
>>> s3
<Student: Student<s_id=3,s_name=xiaohua>>
>>> c1
<Course: Course<c_id=2,c_name=java>>
>>> s3.course.all()
<QuerySet [<Course: Course<c_id=1,c_name=python>>, <Course: Course<c_id=2,c_name=java>>, <Course: Course<c_id=3,c_name=c++>>]>
>>> s3.course.remove(c1)
clear()
从关联的对象集中删除所有的对象。(多对多)
>>> s3.course.clear()
注意对于所有类型的关联字段,add()
、create()
、remove()
和clear()
都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()
方法。
直接赋值
>>> s2
<Student: Student<s_id=2,s_name=xiaohong>>
>>> cs
<QuerySet [<Course: Course<c_id=3,c_name=c++>>]>
>>> s2.course.all()
<QuerySet []>
>>> s2.course = cs
>>> s2.course.all()
<QuerySet [<Course: Course<c_id=3,c_name=c++>>]>
多表查询
跨关联关系的查询
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN
。 若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
# 查询学院名字为‘英语的’的学生的信息
Student.objects.filter(department__d_name='英语')
这种跨越可以是任意的深度。
它还可以反向工作。若要引用一个“反向”的关系,只需要使用该模型的小写的名称。
#查询学生名字中包含‘xiao’的学生的学院信息
Department.objects.filter(student__s_name__contains='xiao')
当你基于ManyToManyField
或反向的ForeignKey
来过滤一个对象时,有两种不同种类的过滤器。考虑Department/Student
关联关系 (一对多的关系)。
# 查询学号为1的学生所有的课程
Course.objects.filter(student__s_id=1)
# 查询报了课程1的所有的学生
Student.objects.filter(course__c_id=1)
# 查询报了'python'课程的的学生的所属学院的信息
Department.objects.filter(student__course__c_name='python')