ORM-多表之间的处理

Posted lijinming110

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘)

 

以上是关于ORM-多表之间的处理的主要内容,如果未能解决你的问题,请参考以下文章

ORM------多表操作

ORM表之间的多对多处理

ORM多表操作(object与queryset)

Django-ORM-多表操作

Django ORM 多表操作

ORM 单表操作查询 多表操作查询及增删改查