一.介绍
如何理解正向、单向查询?
有外键或多对多字段的一方查询相关联的一方叫做正向查询,否则叫反向查询。看图:
二.使用
以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 > 表名__字段,一旦有优先级高的字段,当前字段就不能使用