ORM跨表查询

1.子查询

2.连表查询

正反向概念

外键字段在谁那儿 由谁查谁就是正向
谁手里有外键字段 谁就是正向查
没有外键字段的就是反向
书籍对象 查 出版社 外键字段在书籍 正向查询
出版社 查 书籍 外键字段在书籍 反向查询

正向查询按字段
反向查询按表名小写

基于对象的跨表查询 子查询

1.查询书籍是python入门的出版社名称

book_obj=models.Book.objects.filter(title='python入门').first()
#正向查询按字段
print(book_obj.publish.name)
print(book_obj.publish.addr)

2.查询书籍主键是6的作者姓名

book_obj = models.Book.objects.filter(pk=6).first()
# print(book_obj.authors)  # app01.Author.None 不止一个作者
print(book_obj.authors.all())

3.查询作者是jason的手机号

author_obj=models.Author.object.filter(name='json').first()
print(author_obj.author_detail.phone)
print(author_obj.author_detail.addr)

正向查询 按字段
当该字段所对应的数据有多个的时候 需要加.all()
否者点外键字段直接就能够拿到数据对象

4.查询出版社是东方出版社出版过的书籍

publish_obj=modeks.Publish.objects.filter(name='东方出版社').first()
print(publish_obj.book_set) # app01.Book.None
print(publish_obj.book_set.all())

5.查询作者是jason写过的所有的书

author_obj=models.Author.objects.filter(name='jason').first()
print(author_obj.book_set)  # app01.Book.None
print(author_obj.book_set.all())

6.查询手机号是110的作者

author_detail_obj=models.AuthorDetail.objects.filter(phone=110).first()
print(author_detail_obj.author)
print(author_detail_obj.author.name)
print(author_detail_obj.author.age)

反向查询按表名小写
什么时候需要加 _set
当查询的结果可以是多个的情况下 需要加 _set.all()
什么时候不需要加 _set

当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可

7.查询书籍是python入门的作者的手机号

book_obj=models.Book.objects.filter(title='python入门').first()
print(book_obj.authors.all())

基于双下划线的跨表查询 连表查询

1.查询书籍是python入门的出版社名称

#正向
res=models.Book.objects.filter(title='python入门').values('publish__name')
print(res)
#反向
res=models.Publish.objects.filter(book__title='python入门').values('name')
print(res)

2.查询作者是jason的手机号码

#正向
res=models.Author.objects.filter(name='jason').values('author_detail__phone')
print(res)
#反向
res=models.AuthorDetaid.objects.filter(author__name='jason').values('phone')
print(res)

3.查询手机号是120的作者姓名

res=models.AuthorDetail.objects.filter(phone=120).values('author__name')
print(res)
res=models.Author.objects.filter(author_detail__phone=120).values('name')
print(res)

4.查询出版社是东方出版社出版的书籍名称

res=models.Publish.objects.filter(name='东方出版社').values('book__title')
print(res)

5.查询作者是jason的写过的书的名字和价格

res=models.Author.objects.filter(name='jason').values('book__name','book__price')
print(res)

6.查询书籍是python入门的作者的手机号

res=models.Book.objects.filter(title='python入门').values('author__author_detail__phone')
print(res)
posted on 2019-10-24 20:19  黑糖A  阅读(132)  评论(0编辑  收藏  举报