一,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')