查询API
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
正向查询:关联属性所在的表,查询关联表记录
语 法:book.publish
反向向查询:
语 法:publish_obj.book_set.all()
基于对象的跨表查询
一对一查询【作者与作者明细】
# 正向查询 查询dhh的住址
ret=Author.objects.filter(name="dhh").values("authorDetail__addr")
# 反向查询 查询author_Detail id=1的作者姓名
author_name=AuthorDetail.objects.filter(nid=1).values("author__name")
一对多查询【出版社与书籍】
# 正向查询 查询“天龙八部”的出版社名称
book=Book.objects.filter(title="天龙八部").first()
publish_name=book.publish.name
# 反向查询 查询“上海出版社”出版的所有书籍名称
publish=Publish.objects.filter(name="上海出版社").first()
book_lst=publish.book_set.all()
for book in book_lst:
print(book.title)
多对多查询【书籍与作者】
# 正向查询 查询书籍“倚天屠龙记”的作者姓名
book=Book.objects.filter(title="倚天屠龙记").first()
authors=book.author.all()
for author in authors:
print(author.name)
# 反向查询 查询作者“dhh”出版的所有书籍
author_obj=Author.objects.filter(name="dhh").first()
book_list=author_obj.book_set.all()
基于双下划线的跨表查询
# 1 查询“天龙八部”这本书出版社的名字和邮箱
# 正向查询
# ret=Book.objects.filter(title="天龙八部").values("publish__name","publish__email")
# 反向查询
# ret=Publish.objects.filter(book__title="天龙八部").values("name","email")
# 2 查询“北京出版社”出版的所有的书籍的名称
# 正向查询
# ret=Book.objects.filter(publish__name="北京出版社").values("title")
# 反向查询
# ret=Publish.objects.filter(name="北京出版社").values("book__title")
# 3 查询“天龙八部”这本书籍的作者的年龄
# ret=Book.objects.filter(title="天龙八部").values("author__age")
# 反向查询
# ret=Author.objects.filter(book__title="天龙八部").values("age")
# 4 查询“dhh”出版过的所有的书籍名称
# 正向查询
# ret=Book.objects.filter(author__name="dhh").values("title")
# 反向查询
# ret=Author.objects.filter(name="dhh").values("book__title")
# 5 查询“dhh”的手机号
# 正向查询
# ret=Author.objects.filter(name="dhh").values("authorDetail__telephone")
# 反向查询
# ret=AuthorDetail.objects.filter(author__name="dhh").values("telephone")
# 6 查询手机号为 13322222222 的作者的名字
# 正向查询
# ret=Author.objects.filter(authorDetail__telephone="13322222222").values("name")
# 反向查询
# ret=AuthorDetail.objects.filter(telephone=13322222222).values("author__name")