Django-ORM模型层语法(七)多表查询之子查询(基于对象的跨表查询)

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

生成多表的准备工作已经在博客[Django-ORM模型层语法(四)之多表操作准备工作]中写了,各位可以点击下方的链接,跟着操作:

多表操作的准备工作(非常重要!一定要看喔!)

app01_author表 :

idnameageauthor_detail_id
1Kevin181
2Steven202
3Adam283

app01_book表 :

idtitlepricepublish_datepublishs_id
1红楼梦662020-02-022
2聊斋1002020-02-021
3论语2002020-02-022
4三国演义3002020-02-021
5老子4002020-02-022

app01_authordetail表 :
| id |phone|addr|
|–|–|–|–|
| 1 |100| 南京|
| 2 |200| 北京|
| 3 |300| 深圳|

app01_pulish表 :

idnameaddremail
1东方出版社东方123@qq.com
2西方出版社西方666@qq.com

app01_book_authors表 :
| id |book_id|author_id|
|–|–|–|–|
| 1 |1| 1|
| 2 |1| 2|
| 3 |2| 1|
| 4 |2| 3|
| 5|3| 1|
| 6|3| 2|
| 7|3| 3|

正向查询

app01/tests.py

"""
当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
而是直接写一个测试脚本即可
脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
"""
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行
import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
    import django
    django.setup()
    # 在这个代码块的下面就可以测试django里面的单个py文件了
    # 所有的代码都必须等待环境准备完毕之后书写
    from app01 import models

    # 1.查询书籍主键为1的出版社
    book_obj = models.Book.objects.filter(pk=1).first()
    # 通过书查出版社(正向)
    res = book_obj.publishs
    print(res)

    # 2.查询书籍主键为1的作者
    book_obj = models.Book.objects.filter(pk=1).first()
    # 通过书查作者(正向)
    # res = book_obj.authors  # app01.Author.None
    res = book_obj.authors.all() # <QuerySet [<Author: Author object>, <Author: Author object>]>
    print(res)

    # 3.查询作者Steven的电话号码
    author_obj = models.Author.objects.filter(name='Steven').first()
    res = author_obj.author_detail
    print(res)
    print(res.phone)
    '''
    在书写orm语句的时候跟写sql语句是一样的,不要企图一次性将orm语句写完,如果比较复杂,就写一点看一点
    
    正向什么时候需要加.all()
        当你的结果可能是多个的时候,就需要.all()
        如果是一个则直接拿到数据对象
        book_obj.publishs
        book_obj.authors.all()
        author_obj.author_detail
    '''

反向查询

app01/tests.py

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm1.settings")
    import django
    django.setup()
    from app01 import models

    # 4.查询东方出版社出版的书
    publish_obj = models.Pulish.objects.filter(name='东方出版社').first()
    # 通过出版社查书 反向
    res = publish_obj.book_set # app01.Book.None
    res = publish_obj.book_set.all()
    print(res)

    # 5.查询作者是Steven的书
    author_obj = models.Author.objects.filter(name='Steven').first()
    # 通过作者查书(反向)
    res = author_obj.book_set # app01.Book.None
    res = author_obj.book_set.all()
    print(res)

    # 6.查询手机号是100的作者姓名
    author_detail_obj = models.AuthorDetail.objects.filter(phone=100).first()
    res = author_detail_obj.author
    print(res.name)
    '''
    基于对象的反向查询:
        当你的查询结果可以是过个的时候,就必须加_set.all()
        当你的查询结果只有一个的时候,不需要加_set.all()
    '''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值