Day64 django--ORM2

一,ORM表和表之间的关系

  1.一对一:OneToOneField

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

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

  2.一对多:外键(ForeignKey)

  3.多对多:另外一种关系表(ManyToManyField)

    1.三种方式

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

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

        缺点:自己做连表查询

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

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

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

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

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

    2.以后该用哪种?

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

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

二,ORM关联查询

  1.基于对象的查询

    1.正向查询

      语法:对象.关联字段

    2.反向查询

      1.默认不设置related_name属性

        1.查找的对象是多个的时候(一对多或多对多时)

          语法:publisher_obj.book_set.all()

        2.查找的对象是一个的时候(一对一)

          语法:author_info_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='book'属性

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

猜你喜欢

转载自www.cnblogs.com/lianyeah/p/9932013.html