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}]>