Django——8 关系表的数据操作 表关联对象的访问 多表查询

Django

  1. 关系表中的数据操作
  2. 表关联对象的访问
    1. 关联对象的add方法
    2. create方法
    3. remove方法
    4. clear方法
  3. 多表查询
  4. 查询补充
    1. 聚合查询
    2. 分组查询
    3. F查询
    4. Q查询

关系表的数据操作

在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('添加数据成功')

Django——8   关系表的数据操作  表关联对象的访问  多表查询

一对多的数据添加

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()

Django——8   关系表的数据操作  表关联对象的访问  多表查询

  • 1.第一种方式就是跟之前的一样,用传参的方法添加,需要注意的是外键的值必须是关联表中已经存在的值.
  • 2.第二种方式是用的属性赋值的方式,因为我们在模型类有定义了一个department的属性,而这个属性的对象的类型必须是department表的类实例对象

 表关联对象的访问

在学生表和学院表之间进行关联对象的访问

这里我们通过python manage.py shell 来进行

先导入数据模型

Django——8   关系表的数据操作  表关联对象的访问  多表查询

通过s1的学院信息

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Student的模型类中我们有定义department的属性,所以当我们去访问的时候,可以直接通过student.department的形式去找到某个学生的所属学院是哪个.

查看一个d1学院的所有学生 ()

  如果模型I有一个ForeignKey,那么该ForeignKey 所指的模型II实例可以通过一个管理器回前面有ForeignKey的模型I的所有实例。默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。
  主键查看外键用_set.all()

Django——8   关系表的数据操作  表关联对象的访问  多表查询

可以在定义时设置related_name 参数来覆盖foo_set 的名称.
Django——8   关系表的数据操作  表关联对象的访问  多表查询

添加了related_name的参数后,重新打开一个IDLE,
访问时就能直接用设置的参数作为属性了.

这样使用_set的地方就可以用related_time来替换

Django——8   关系表的数据操作  表关联对象的访问  多表查询

现在给Course添加数据

Django——8   关系表的数据操作  表关联对象的访问  多表查询

在学生表中再添加一些数据:

Django——8   关系表的数据操作  表关联对象的访问  多表查询

现在再来查询一下学院1的所有学生

Django——8   关系表的数据操作  表关联对象的访问  多表查询

处理关联对象的方法

  • add(obj1, obj2, ...)  添加的已经存在数据库的数据
  • 添加一指定的模型对象到关联的对象集中。

Django——8   关系表的数据操作  表关联对象的访问  多表查询

注意Course的多对多属性student,现在

使学生1选择了课程1

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

使学生5选择了课程3

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

现在把再学院2的王五换到学院3

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

  • create(**kwargs)  添加不存在的数据 ,将数据直接存入数据库
  • 创建一个新的对象,将它保存并放在关联的对象集返回新创建的对象。

学院4来了个新同学小雅

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

remove(obj1, obj2, ...)

  • 从关联的对象集中删除指定的模型对象。
  • 删除的是关系表中的数据

首先先添加一些数据

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

 clear()    从关联的对象集中删除所有的对象
Django——8   关系表的数据操作  表关联对象的访问  多表查询

注意对于所有类型的关联字段,add()、create()、remove()和clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法。

 多表查询——跨关联关系的查询

Django 提供一种强大而又直观的方式来“处理”查询中的关联关系,它在后台自动帮你处理JOIN。

若要跨越关联关系,只需使用关联的模型字段的名称,并使用双下划线分隔,直至你想要的字段:

查询学院名字为‘计算机学院’的学生的信息

# 查询学院名字为‘计算机’的学生的信息
res = Student.objects.filter(department__d_name='计算机')

Django——8   关系表的数据操作  表关联对象的访问  多表查询

查询学生名字中包含 '小' 的学生的学院信息

# 查询学生名字中包含 '小' 的学生的学院信息
res = Department.objects.filter(student__s_name__contains='小')

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

查询学号为1的学生所有的课程

# 查询学号为1的学生所有的课程
res = Course.objects.filter(student__s_id=1)

Django——8   关系表的数据操作  表关联对象的访问  多表查询

查询报了课程1的所有的学生

# 查询报了课程1的所有的学生
res = Student.objects.filter(course__c_id=1)

Django——8   关系表的数据操作  表关联对象的访问  多表查询

查询报了'python'课程的的学生的所属学院的信息

# 查询报了'python'课程的的学生的所属学院的信息
res = Department.objects.filter(student__course__name='python')

Django——8   关系表的数据操作  表关联对象的访问  多表查询

聚合查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

分组查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

F查询

from django.db.models import Q, F

Django——8   关系表的数据操作  表关联对象的访问  多表查询

Q查询

Django——8   关系表的数据操作  表关联对象的访问  多表查询

上一篇:poj3071


下一篇:tomcat服务器搭建之ngrok——将内网地址映射到外网