| 关系属性(字段)写在那个表中,从当前表(类)的数据去查询它关联表(类)中的数据叫正向查询,反之叫反向查询 | #一对一 正向查询 # 查询yage的电话 author_obj=models.Author.objects.filter(name='yage').first() print(author_obj.authorDetail) print(author_obj.authorDetail.telepbone) 反向查询 # 查询这个电话 145523669874 是谁的 author_detail_obj=models.AuthorDertail.objects.get(telrphone=145523669872) print(author_detail_obj.author) print(author_detail_obj.author.name) """ 正向查询Author_obj.authorDateil,对象.关联属性 Author------------------------->AuthorDateil Author<-------------------------AuthorDateil 反向查询:AuthorDateil.author,对象.小写类名 """ #一对多 正向查询 # 查询某本书 java核心 的 出版社是哪个 book_obj=models.Book.objects.get(title='java核心') print(book_obj.publish) print(book_obj.publish.name) 反向查询 #清华出版社出版的那些书 pub_pbj=models.Publish.objects.get(name='清华出版社') print(pub_obj.book_set.all()) """ 正向查询 book_obj.publishs 对象.属性 Book------------------------------>>>Publish Book<<<------------------------------Publish 反向查询 pub_obj.book_set.all() 对象.表名小写_set """ #多对多 正向查询 # 查询某本书 java核心 是谁出版的 book_obj=models.Book.objects.get(title='java核心') print(book_obj.authors.all()) 反向查询 #查询 yage 写了哪些书 author_obj=models.Author.object.get(name='yage') print(author_obj.book_set.all()) """ 正向查询 book_obj.authors.all() 对象.属性 book --------------->author book <---------------author 反向查询 author_obj.book_set.all() 对象.表名小写_set """ 基于双下划线的跨表查询--连表查询 join
Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的model 为止。
''' 基于双下划线的查询就一句话:正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表,一对一、一对多、多对多都是一个写法,注意,我们写orm查询的时候,哪个表在前哪个表在后都没问题,因为走的是join连表操作。 ''' # 一对一 #1. 查询yage的电话 # 方式一 正向查询 obj=models.Author.object.filter(name='yage').values('authorDetail__telepbone') print(obj) # 方式二 反向查询 obj=models.AuthorDetail.objects.filter(author__name='yage').values('telephone') print(obj) #2. 谁的电话是 145523669874 obj=models.AuthorDetail.object.filter(telephon='145523669874').values('authors__name') print(obj) obj=models.Author.objects.filter(authorDetail__telephon='145523669874').values('name') print(obj) # 一对多 # 查询某本书 java核心 的 出版社是哪个 obj=models.Book.objects.filter(name='java核心').values('publish__name') obj=models.Publish.objects.filter(book__title='java核心').values('name') # 清华出版社出版的那些书 obj=models.Publish.objects.filter(name='清华出版社').values('book__title') print(obj) obj=models.Book.object.filter(publish__name='清华出版社').values('title') print(obj) # 多对多 # 查询某本书 java核心 是谁出版的 obj=models.Book.objects.filter(title='java核心').values('authors__name') print(obj) obj=models.Author.objects.filter(book__title='java核心').values('name') print(obj) # 查询 yage 写了哪些书 #方法一 obj=models.Author.objects.filter(name='yage').values('book__title') print(obj) #方法二 obj=models.Book.objects.filter(authors__name='yage').values('title') print(obj) #进阶查询一 #清华出版社 出版的书 以及作者姓名 #方法一 obj=models.Publish.objects.filter(name='清华出版社').values('book__title','book__authors__name') print(obj) #方法二 obj=models.Book.objects.filter(publish__name='清华出版社').values('title','authors__name') print(obj) #方法三 obj=models.Author.objects.filter(book__publish__name='清华出版社').values('name','book__title') print(obj) 进阶查询二 #手机号以 14552 开头的作者 出版过的所以书籍名称 以及 出版社名称 #方法一 obj=models.AuthorDetail.objects.filter(telephone__startswith='14552').values('author__book__title' , 'author__book__publish__name') print(obj) #方法二 obj=models.Author.objects.filter(authorDetail__telephone__startswith='14552').values('book__title','book__publish__name') print(obj) #方法三 obj=models.Book.objects.filter(authors__authorDetail__telephone__startswith='14552').values('authors__book__title','authors__book__publish__name') print(obj) related_name