• 09-表关联对象及多表查询


    表关联对象及多表查询

    01、关系表的数据操作

    02、表关联对象的访问

    03、多表查询

     

    01、一对多(正向)

    正向,如果一个模型有外键字段,通过这个模型对外键进行操作叫做正向

    • 一对多(增)
    • - 通过属性复制
      - 通过主键的方式

    例子:方法一

     例子:方法二

     

    • 一对多(改)

     

    • 一对多(删)
    • 删  只有外键设置了null=True,你就可以通过赋值None来删除关系。

    • 一对多(查)
    • 查外键关联的数据   用法:filter(关联表的字段_被关联表=数据)


    02、一对多(正向)

    个模型如果被另外一个模型外键关联,通过这个模型对关联它的模型进行操作交错反向

    查(被关联模型数据 . 关联模型名称的小写_set . 查询方法() )

    通过管理器,默认管理器是,有外键的模型名称的小写加上_set(foo_set, foo是模型名称小写),通过这个管理器可以查询模型的实例,

    在定义外键的时候,通过related_name 可以覆盖这个名称

    - 通过add方法 ,可以添加多个
    - 通过create方法

     

    方法二、

     

     删(删掉关系)

    remove(obj1, obj2,boj3)
    - clear() 清空,慎用

    add,remove,clear 直接操作数据库

    改 替换对象集

    - set([s1, s2])

     

    03、多对多

    • 如果因为有额外字段,自定义了中间模型,我们需要通过中间模型的管理器,进行manytomany关系的创建和删除。
    • 默认情况,跟一对多中的,add,create,remove,clear 用法一致。
    • 唯一的区别是,多对多正向的时候,多对多字段就是个管理器。反向的时候,跟一对多的方向一致,也是在模型小写后面加上_set.  和一对多类似,一样可以通过定义related_name 可以覆盖这个名称

    04、一对一

    • 非常类似一对一字段,增删改查和普通字段没有什么区别。
    • 反向的时候,使用模型的小写,也可以给related_name覆盖,这个就不是管理器,就是一个普通属性。
    • 注意,一个被一对一管理的模型,它的实例,如果没有被分配关系。
    • 举个例子:学生对象,没有分配一个学生详情对象。如果去取,会抛出异常,DoseNotExist

    05、跨表查询

    要跨越关系,只需要使用跨越模型的相关字段的字段名,以下划线分隔,直到达到你想要的字段为止。

    例如:查询男生都报名了什么课程

    ```
    res = Course.objects.filter(students__sex=1).distinct()        # distinct() 作用是去重
    ```

    这个关系要多深就有多深

    例如:查询所有报名了 python 课程的学员

    ```
    res = Student.objects.filter(course__name__contains='python')      # contains 包含
    ```

    例如:查询所有报名了python全栈课程,在django框架第7期班级的学员

    ```
    res = Student.objects.filter(course__name='python全栈', grade__name='django框架', grade__num='7')
    ```

    例如:学员报名了python课程的班级有哪些

    ```
    res = Grade.objects.filter(students__course__name__contains='python').distinct()

  • 相关阅读:
    poj 1321 棋盘问题 (DFS深度优先搜索)
    HDOJ1312 Red and black(DFS深度优先搜索)
    《数据结构》例1.3
    hdoj1905 Pseudoprime numbers (基础数论)
    百练4003 十六进制转十进制(水题)
    第二天——2.23
    第一天——2.22
    返校——2.21
    被盗号了——2.19
    继续咸鱼——2.18
  • 原文地址:https://www.cnblogs.com/jun-1024/p/10699027.html
Copyright © 2020-2023  润新知