Django
关系表的数据操作
在views中导入modles模型中的,Django7中创建的模型
from .models import Department, Student, Stu_Detail, Course
先给Department添加数据
def doo(request):
# department添加数据
d1 = Department(d_name='计算机').save()
Department.objects.get_or_create(d_name='外国语')
Department.objects.create(d_name='电子')
d4 = Department(d_name='美术').save() return HttpResponse('添加数据成功')
、
一对多的数据添加
Student添加数据
方法一:
# Student添加数据、方法一:直接添加
Student.objects.get_or_create(s_name='小明', department_id=1)
s2 = Student(s_name='小红', department_id=2).save()
方法二:
# 方法二查找后添加
d4 = Department.objects.get(d_name='美术')
s3 = Student(s_name='小美')
s3.department = d4
s3.save()
d3 = Department.objects.get(d_id=3) # 电子
s3 = Student(s_name='小草')
s3.department = d3
s3.save()
- 1.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.
- 2.第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象
表关联对象的访问
在学生表和学院表之间进行关联对象的访问
这里我们通过python manage.py shell 来进行
先导入数据模型
通过s1的学院信息
Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个.
查看一个d1学院的所有学生 ()
如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。
主键查看外键用_set.all()
可以在定义时设置related_name 参数来覆盖foo_set 的名称.
添加了related_name的参数后,重新打开一个IDLE,
访问时就能直接用设置的参数作为属性了.
这样使用_set的地方就可以用related_time来替换
现在给Course添加数据
在学生表中再添加一些数据:
现在再来查询一下学院1的所有学生
处理关联对象的方法
- add(obj1, obj2, ...) 添加的已经存在数据库的数据
- 添加一指定的模型对象到关联的对象集中。
注意Course的多对多属性student,现在
使学生1选择了课程1
使学生5选择了课程3
现在把再学院2的王五换到学院3
- create(**kwargs) 添加不存在的数据 ,将数据直接存入数据库
- 创建一个新的对象,将它保存并放在关联的对象集返回新创建的对象。
学院4来了个新同学小雅
remove(obj1, obj2, ...)
- 从关联的对象集中删除指定的模型对象。
- 删除的是关系表中的数据
首先先添加一些数据
clear() 从关联的对象集中删除所有的对象
注意对于所有类型的关联字段,add()、create()、remove()和clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。
多表查询——跨关联关系的查询
Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。
若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:
查询学院名字为‘计算机学院’的学生的信息
# 查询学院名字为‘计算机’的学生的信息
res = Student.objects.filter(department__d_name='计算机')
查询学生名字中包含 '小' 的学生的学院信息
# 查询学生名字中包含 '小' 的学生的学院信息
res = Department.objects.filter(student__s_name__contains='小')
查询学号为1的学生所有的课程
# 查询学号为1的学生所有的课程
res = Course.objects.filter(student__s_id=1)
查询报了课程1的所有的学生
# 查询报了课程1的所有的学生
res = Student.objects.filter(course__c_id=1)
查询报了'python'课程的的学生的所属学院的信息
# 查询报了'python'课程的的学生的所属学院的信息
res = Department.objects.filter(student__course__name='python')
聚合查询
分组查询
F查询
from django.db.models import Q, F
Q查询