17.正向查询和反向查询

编程入门 行业动态 更新时间:2024-10-28 06:32:45

17.正向查询和反向查询

17.正向查询和反向查询

一.介绍

如何理解正向、单向查询?
有外键或多对多字段的一方查询相关联的一方叫做正向查询,否则叫反向查询。看图:

二.使用

以Book表和Publisher(外键关系)为例,多对多关系表类似,正向查询就不写了,直接查就好了,这里写反向查询,用publisher中的数据去查book数据

1.基于对象的反向查询(借助管理对象)

(1)不设置related_name字段

class Book(models.Model):publisher = models.ForeignKey("Publisher",on_delete=models.CASCADE)我要查id为1的出版社出版的书籍
obj = models.Publisher.objects.get(id=1)  #先获取一个publihser对象
manager = obj.book_set    #通过写(小写表名_set)属性拿到管理对象
print(manage.all())   #就可以获取所关联的所有对象

(2)设置了related_name字段

class Book(models.Model):publisher = models.ForeignKey("Publisher",on_delete=models.CASCADE,related_name="books")我要查id为1的出版社出版的书籍
obj = models.Publisher.objects.get(id=1)  #先获取一个publihser对象
manager = obj.books    #通过related_name
print(manage.all())   #就可以获取所关联的所有对象

2.基于字段的反向查询(不借助管理对象)

(1)不设置related_name

class Book(models.Model):publisher = models.ForeignKey("Publisher",on_delete=models.CASCADE)查询书名为xx所对应的出版社
obj = models.Publisher.objects.get(book__name="xx")
#  __表示跨表   拿到的直接是所关联的那个对象

(2)设置了related_name

class Book(models.Model):models.ForeignKey("Publisher",on_delete=models.CASCADE,related_name="books")查询书名为xx所对应的出版社
obj = models.Publisher.objects.get(books__name="xx")
# 设置了related_name,表名__字段就不能使用

(3)设置了related_query_name

class Book(models.Model):models.ForeignKey("Publisher",on_delete=models.CASCADE,related_name="books",related_query_name="qbook")查询书名为xx所对应的出版社
obj = models.Publisher.objects.get(qbook__name="xx")
# 设置了related_query_name,related_name和表名__字段就不能使用

三.总结

1.基于对象的查询,查询的结果是管理对象,后续操作要借助管理对象
设置了(related_name)后(表名_set)方法就不能使用
2.基于字段的查询,__表示跨表的意思,可以用(表名__字段)、related_name__字段、related_query_name字段进行查询
3.优先级:related_query_name > related_name > 表名__字段,一旦有优先级高的字段,当前字段就不能使用

更多推荐

17.正向查询和反向查询

本文发布于:2024-02-12 06:56:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1686694.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!