Py006-01-18基于双下划线的跨表查询

基于双下划线的跨表查询(join查询)

  • key:正向查询按字段,反向查询按表名小写

orm表如下:





一对多
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 一对多 正向查询:查询金瓶梅这本书的出版社名字
# 基于双下划线的跨表查询(join)
# 一对多 正向查询:查询金瓶梅这本书的出版社名字
'''
select app01_publish.name from app01_book inner join app01_publish
on app01_book.publish_id = app01_publish.nid
where app01_book.title = '金瓶梅'

正向查询按字段,
反向查询按表名小写
用来告诉orm引擎join那个表
'''
# 方式一
res = Book.objects.filter(title='金瓶梅').values("publish__name") # 正向查询按字段 关联的字段也就是---publish 查指定字段就双下划线+字段

# 方式二
res2 = Publish.objects.filter(book__title='金瓶梅').values('name')
多对多查询

查询金瓶梅这本书所有作者的名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'''
select app01_author.name from app01_book inner join app01_book_authors
on app01_book.nid = app01_book_authors.book_id
inner join app01_author
on app01_book_authors.authors_id = app01_author.nid
where app01_book.title = '金瓶梅'
'''
# 方式一:正向
#需求: 通过Book表join与其关联的Author表,按字段
Book.objects.filter(title='金瓶梅').values("authors__name")

# 方式二:反向
#需求: 通过Author表join与其关联的Book表,按表名小写
Author.objects.filter(book__title='金瓶梅').values("name")
一对一
1
2
3
4
5
6
# 查询alex手机号
# 方式一 正向查询
Author.objects.filter(name='alex').values("authordetail__telephone")

# 方式二
AuthorDetail.objects.filter(author_name="alex").values("telephone")
进阶练习:(连续跨表)
1
2
3
4
5
6
7
# 查询 手机号以110开头的作者出版过的所有书籍名称以及出版社名称
# 方式一:
# 需求:通过Book表join AuthorDetail表,Book和AuthorDetail无关联,所有必须连续跨表
res = Book.objects.filter(authors__authordetail__telephone__startswith='110').values('title','publish__name')

# 方式二:
res = Author.objects.filter(authordetail__telephone__startswith='110').values("book__title","book__publish__name")