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