首先,在项目中添加我们要查询的模型,并插入数据
在django根目录下创建一个查询的py文件,供我们测试
ORM跨表查询可以分为基于 对象的查询(子查询) 和基于 queryset(双下划线__) 的查询
基于对象的查询(子查询)
一对多的查询
正向查询:在有关联字段的表向被关联的表查询
一对多的正向查询(正向查询按字段)
查询名为 python开天辟地 这本书的出版社的邮箱
book_obj = models.Book.objects.filter(title="python开天辟地").first() print(book_obj.publish.email)
一对多的反向查询(先查出1的这个对象,然后表名小写_set,查询与这个对象关联的对象)
查询名为朝阳门的出版社出版过的所有书籍名称
publish_obj = models.Publish.objects.filter(name="朝阳门出版社").first() for book in publish_obj.book_set.all(): print(book.title)
多对多的查询
多对多的正向查询
查询名为python开天辟地的这本书的作者的年龄
book_obj = models.Book.objects.filter(title="python开天辟地").first() for author in book_obj.author.all(): print(author.name,author.age)
多对多的反向查询
查询作者呲花出版的所有书籍的名字
author_obj = models.Author.objects.filter(name="呲花").first() for book in author_obj.book_set.all(): print(book.title)
一对一的查询
一对一正向查询
查询作者狗城的手机号
author_obj = models.Author.objects.filter(name="狗城").first() print(author_obj.authorDetail.telephone)
一对一反向查询
查询手机号是17777777777的作者是谁(一对一反向查询,直接表名就可以,不用跟_set)
authordetail_obj = models.AuthorDetail.objects.filter(telephone=17777777777).first() print(authordetail_obj.author.name)
基于queryset的查询
本质上是join关联表查询
一对多的正向查询(字段加__要查询的属性)
查询书名python开天辟地这本书的出版社的邮箱
models.Book.objects.filter(title="python开天辟地").values("publish__email")
一对多的反向查询(values里边要查询的表名小写加__要查询的属性)
查询名为朝阳门的出版社出版过的所有书籍名称
方式一:
book_list = models.Publish.objects.filter(name="朝阳门出版社").values("book__title") for book in book_list: print(book["book__title"])
方式二:
book_list = models.Book.objects.filter(publish__name="朝阳门出版社").values("title") # 过滤所有书籍里出版社的名字 for book in book_list: print(book["title"])
查询手机号以177开头的作者出版的书籍以及书籍对应的出版社名称
这种多表关联查询,首先定位基表(book),然后通过跨表双下划线,组合成一张大表,通过条件筛选
print(models.Book.objects.filter(author__authorDetail__telephone__startswith="177").values("title", "publish__name"))
原文地址:https://www.cnblogs.com/ligiao/p/11159273.html
时间: 2024-11-04 17:08:11