17.正向查询和反向查询

一.介绍

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

在这里插入图片描述

二.使用

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

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

(1)不设置related_name字段

class Book(models.Model):
	publisher = models.ForeignKey("Publisher",on_delete=models.CASCADE)

我要查id1的出版社出版的书籍
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")

我要查id1的出版社出版的书籍
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 > 表名__字段,一旦有优先级高的字段,当前字段就不能使用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值