zoukankan      html  css  js  c++  java
  • ORM-多表之间的处理

    1.ORM表和表之间的关系:

      1.一对多  --> 外键(Primary_Key)

      2.多对多  -->另一张关系表(ManyToManyField)

        1.三种方式建立关系表

          1.自己建立第三张关系表,外键分别关联连个表

            优点:可以扩充第三张关系表的字段

            缺点:自己做连表查询

          2.通过ORM内置的ManyToManyField,自动建立第三张关系表

            优点:提供了很多连表操作的快捷方法 --> all(),set(),clear(),add(),remove()

            缺点:无法拓展第三张关系表

          3.自己创建第三张关系表,通过ManyToManyField关联

            1.优点:既能够使用多对多查询的快捷方法all(,还能够自己拓展第三张关系表的字段)   

        2.该使用哪一种?

          1.当第三张关系表中不需要其他额外字段的时候,我们就用默认的ManyToManyField就可以了

          2.当第三张表中需要额外的字段时,我们就要用第三中方式,自己建立第三张关系表.

      3.一对一  -->OneToOneField

        1.当一张表里的字段非常多,并且某几个字段的查询频率远远大于其他字段的时候

        2.把常用字段单独拆成一张表,查询的时候更加快捷

    2.ORM关联查询

      1.基于对象的查询:

        1.正向查询:

          对象.关联字段

        2.反向查询

          1.默认不设置related name 属性

            1.查找的对象是多个的时候

              publisher_obj.book_set.all()

            2.查找的对象时一个的时候

              author_obj.author.name

          2.设置related_name='books'属性

            publisher_obj.books.all()

      2.基于QuerySet的查询

        1.正向查

          Book.objects.filter(id=1).values_list('publisher__name')

        2.反向查

          1.默认不设置related_name属性,默认就用类名的小写

            Publisher.objects.filter(id=1).values_list('book__price')

          2.设置related_name='books'属性

            Publisher.objects.filter(id=1).values_list('books__price')

  • 相关阅读:
    mysql排行榜sql的实现
    MYSQL 简单的循环存储过程
    Git学习笔记
    LeetCode-树-简单-108-110-111
    Android开发连接mysql云数据库中遇到的的一些问题
    使用mybatis遇到报错Invalid bound statement (not found)
    ajax使用时碰到的一些坑
    关于Echarts的常见报错
    deepin系统桌面图标和菜单栏突然消失
    SOA架构理解
  • 原文地址:https://www.cnblogs.com/lijinming110/p/9929779.html
Copyright © 2011-2022 走看看