06-模型层4—多表操作之基于双下划线的跨表查询

一、几个结论

1、基于双下划线的跨表查询————最终翻译成SQL语句都是“join查询” 
    
2、正向查询按字段,反向查询按表名小写——用来告诉ORM引擎join哪张表。

3、跨表查询————先join成一张表,再执行“单表查询”

4、values()等同于select;filter()等同于where。

一对多

正向查询按字段,反向查询按表名小写用来告诉ORM引擎join哪张表

一个例子

查询水浒传这本书的出版社的名字:Book与Publish

(1)SQL语句这样写:

select publish.name from book inner join publish 
on book.publish_id = publish.nid 
where book.title = '水浒传'

正向查询

以Book为基准,因为“关联字段”在Book类中

Book里面这样定义的:

publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE,null=True)

因此这样进行正向查询

values()等同于select;filter()等同于where。  
ret = Book.objects.filter(title='水浒传').values('publish__name')
print(ret) #<QuerySet [{'publish__name': '333'}]>

反向查询

从Publish查Book
##反向查询按表名小写~
## values()等同于select;filter()等同于where
ret = Publish.objects.filter(book__title='水浒传').values('name')
print(ret) #<QuerySet [{'name': '333'}]>

多对多

一个例子

查询三国群英这本书所有作者的名字
Book、Author、book_authors表

(1)SQL语句这样写

select author.name from book inner join book_authors
on book.nid = book_authors.book_id
inner join author
on book_authors.author_id = author.nid
where book.title = '三国群英'

(2)正向查询

以Book为基准,因为“关联字段”在Book类中

##Book里面是这样定义的:
authors = models.ManyToManyField(to='Author')
    
##正向查询方法:
##通过Book表join与其关联的Author表————按字段authors通知ORM引擎去join 表book_authors与表author。
##正向查询按字段
ret = Book.objects.filter(title='三国群英').values('authors__name')
print(ret)  #<QuerySet [{'authors__name': 'whw'}, {'authors__name': 'www'}]>

(2)反向查询

以AUthor为基准反查

##反向查询的方法:
##通过Author表join与其关联的Book表————按表名小写book通知ORM引擎去join 表book_authors与表book。
##反向查询按表名小写
ret = Author.objects.filter(book__title='三国群英').values('name')
print(ret) #<QuerySet [{'name': 'whw'}, {'name': 'www'}]>

一对一

Author与AuthorDetail

一个例子

查询whw的手机号

(1)正向查询

正向查询按字段——##通过Author表join与其关联的AUthorDetail表,按字段authordetail通知ORM引擎去join 表authordetail
ret = Author.objects.filter(name='whw').values('authordetail__telephone')
print(ret) #<QuerySet [{'authordetail__telephone': 123123123}]>

(2)反向查询

反向查询按表名小写——##通过AuthorDetail表join与其关联的AUthor表,按表名小写author通知ORM引擎去join 表author
ret = AuthorDetail.objects.filter(author__name='whw').values('telephone')
print(ret) #<QuerySet [{'telephone': 123123123}]>
posted on 2019-05-19 10:27  江湖乄夜雨  阅读(137)  评论(0编辑  收藏  举报