基于双下划线的跨表查询(join实现)
总结:正向查询按字段,反向查询按表明小写
1.1一对多正向查询
查询在跨表中可以有两种方式,正向查询就是关键字段在你要搜索的表,没有关键字段就是反向查询.
跨表查询的显著特点是__双下划线,这道题中在你要找到name,但是Book中没有,通过正向查询关键字段+__来
跨表找到name
ret=Book.objects.filter(title="python").values("publish__name")
ret=Publish.objects.filter(book__title="python").values("name")
print(ret) <QuerySet [{'name': '云南出版社'}]>
1.2一对多反向查询
查询小瑞出版社出版的所有的书籍的名称
这道题中反向解析在出版社开始找,但是条件没有'小瑞',跨表寻找条件,
在filter条件先通过反向查询表名小写__+条件找到
ret=Book.objects.filter(publish__name="小瑞").values("title")
print(ret)<QuerySet [{'book__title': 'linux'}, {'book__title': 'css'}]>
2.1多对多正向查询
查询python这本书籍的作者的年龄
在多对多的环境下,和一对多查询一样,是因为django是在太过强大,通过字段和表名小写
将多对多关系的三张表统统间接在一起,各取所需,
ret=Book.objects.filter(title="linux").values("authors__age")
print(ret)<QuerySet [{'authors__age': 18}, {'authors__age': 25}]>
ret=Author.objects.filter(book__title="linux").values("age")
2.2多对多反向查询
查询apollo出版过的所有的书籍名称
ret=Author.objects.filter(name="apollo").values("book__title")
print(ret)<QuerySet [{'book__title': 'python5'}, {'book__title': 'linux'}, {'book__title': 'css'}]>
ret=Book.objects.filter(authors__name="apollo").values("title")
print(ret)
3.1一对一正向查询
查询apollo的手机号
ret=Author.objects.filter(name="alex").values("ad__tel")
print(ret)<QuerySet [{'ad__tel': 123}]>
ret=AuthorDetail.objects.filter(author__name="alex").values("tel")
print(ret)
3.2一对一正向查询
查询手机号为110的作者的名字
ret=AuthorDetail.objects.filter(tel="234").values("author__name")
print(ret)<QuerySet [{'author__name': 'egon'}]>
ret=Author.objects.filter(ad__tel="234").values("name")
print(ret)
4.1多个表单连续查询
查询小瑞出版社出版过的所有书籍的名字以及作者的姓名
这里可以通过表之间的关系逐步连成一张大表查询,注意的是连接时
是正向还是反向查询
ret=Publish.objects.filter(name="小瑞").values("book__title","book__authors__name")
print(ret)<QuerySet [{'book__title': 'linux', 'book__authors__name': 'alex'}, {'book__title': 'css', 'book__authors__name': 'alex'}, {'book__title': 'linux', 'book__authors__name': 'egon'}, {'book__title': 'css', 'book__authors__name': 'egon'}]>
ret=Author.objects.filter(book__publish__name="小瑞").values("name","book__title")
print(ret)