zoukankan      html  css  js  c++  java
  • 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('添加数据成功')

    一对多的数据添加

    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查询

  • 相关阅读:
    UVA-11437 Triangle Fun
    UVA 10491
    CF 223C
    poj 3273
    由异常掉电问题---谈xfs文件系统
    好久没有写博客了,最近一段时间做一下总结吧!
    Json.Net
    div 旋转
    VirtualBox虚拟机网络设置
    windows 2003 安装 MVC 环境 404错误,无法找到该页
  • 原文地址:https://www.cnblogs.com/pywjh/p/10197443.html
Copyright © 2011-2022 走看看