django框架基于queryset和双下划线的跨表查询操作详解
本文实例讲述了django框架基于queryset和双下划线的跨表查询操作。分享给大家供大家参考,具体如下:
前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(。。。) 对象.关联对象_set.all(...) -->反向
基于对象的跨表查询例如:
book_obj=Book.objects.filter(id=4).first()#注意多了个first print(book_obj)#go这里得到的是一个models对象 print(book_obj.publish.name)#桔子出版社
这篇随笔主要写的是基于双下划线的跨表查询,其本质是使用join连接其他表进行查询
一对多
defquery(request): #正向查询 ret1=Book.objects.filter(title='西游记').values("publish__name") print(ret1)#print(ret1.first(),type(ret1.first()))#{'publish__name':'榴莲出版社'} 注意key为publish__name print(ret1.first()['publish__name'])#榴莲出版社 #反向查询 ret2=Publish.objects.filter(book__title="西游记").values('name')#这里的book是表名称,book表里面有字段title print('---------------------------------') print(ret2)# print(ret2.first()['name'])#榴莲出版社 returnHttpResponse('ok')
多对多
#查询python书的作者的名字和年龄 defquery(request): #正向查询 ret=Book.objects.filter(title="python").values("authors__name","authors__age") print(ret)#注意结果的key #结果#反向查询 ret=Author.objects.filter(book__title="python").values("name","age") print(ret)#区分正向查询的key #结果 returnHttpResponse('ok')
一对一
例子:查询名字为xiao的gf是什么
defquery(request): #正向查询 ret=Author.objects.filter(name='xiao').values('ad__gf')#Author设置了外键到AuthorDetail print(ret)##反向查询 ret=AuthorDetail.objects.filter(author__name='xiao').values('gf') print(ret)# returnHttpResponse('ok')
下面进行跨多表查询,涉及三个表或者以上
#查询西瓜出版社出版过的书籍和书籍作者的名字 defquery(request): #正向 ret=Book.objects.filter(publish__name="西瓜出版社").values_list("title",'authors__name') print(ret) ##反向 ret=Publish.objects.filter(name="西瓜出版社").values_list("book__title","book__authors__age","book__authors__name") print(ret) # returnHttpResponse('ok')
手机号以11开头的作者出版过的所有书籍名称以及出版社名称
defquery(request): #正向 ret=Book.objects.filter(authors__ad__tel__startswith="11").values("title","publish__name") print(ret) ##反向 ret=Author.objects.filter(ad__tel__startswith="11").values("book__title","book__publish__name") print(ret) # returnHttpResponse('查询成功')
希望本文所述对大家基于Django框架的Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。