related_query_name和related_name有什么区别?

related_query_name和related_name有什么区别?

如题,其他答疑出问题了没看到答案。

正在回答

登陆购买课程后可参与讨论,去登陆

5回答

同学,你好。老师根据同学的问题具体作答了,也为之前的内容做了更加详细的表述,同学可直接查看下面的回答,重新理解

问题一:查出来是Blog表里id=1的对象,在B表里blog字段所在的某对象

问题二:related_name是本表外键关联的对象反向来查找本表时用到的名称,related_query_name是用本表外键关联的对象根据本表某些字段做筛选条件时要用到的名称,得到本表外键关联的对象,以下图为例:

http://img1.sycdn.imooc.com//climg/5f0d6a7f0995190808500397.jpg

related_name:根据Tag外键所关联的表Article表来查找的Tag模型对象

>>>a = Article.objects.get(id=1)

 >>>a.tags.all()   #找到的是Tag对象

>>>a.tags.filter(name="important")    #找到的是Tag对象的name值等于important的对象

a.tags.filter(name="important")  和Tag.objects.filter(name="important")是一个意思,tags也就是Tag对象的反向管理器,objects是Tag对象的管理器,所以反向指从一个模型外键所关联的对象反向来找到本模型的管理器,写法为“一个模型外键所关联的对象.related_name”

related_query_name:用于本表外键关联的对象Article根据本表Tag某些字段做筛选条件时要用到的名称,得到本表外键关联的对象Article,如得到外键为Article的模型Tag对象的name值等于important的Article对象

>>>Article.objects.filter(tag__name="important")

问题三、related_query_name只有这个双下划线用法?老师所了解的是的,如果还有其他用法,同学也可使用,因为发现其他好用的功能为什么不用呢。

如果解决了你的疑惑,请采纳,祝学习愉快~ 

  • 江民川 提问者 #1
    老师,什么关联啊所关联啊这些词我都绕晕了,我只想以具体实例来说话然后自己慢慢理解,我的意思是: (这个例子里就Article和Tag两张表) a.tags.all()是,限制Article表里字段(id)的条件,最终找到Tag表里的某个对象(一行数据);而tag__name=……是,限制Tag表里字段(name)的条件,最终找到Article表里的某个对象(一行数据)。对吗? 这样看的话,用related_name和related_query_name的查找方向是相反的,相反的
    2020-07-14 20:52:21
  • 江民川 提问者 #2
    “查找外键为Article的表的关联对象”,这句话我看着就很绕,还是没明白最终到底是查找谁,而我的理解如上回复,老师又说related_name和related_query_name都是“查找外键为Article的表的关联对象”,看起来和我的理解完全相反,我都不知道是我逻辑错了还是用词表达错了,一头雾水。
    2020-07-14 21:02:05
  • 江民川 提问者 #3
    我想弄清楚是哪个理解环节有问题,才会得到这种完全相反的结论。 我对“查找外键为Article的表的关联对象”这句话的理解:"外键为Article的表"是“Tag表”,“‘Tag表’的关联对象”不就是Article表里的对象,这句话意思就是“找Article表里的对象”,何必“查找外键为Article的表的关联对象”这般说得复杂?——首先问题一,我对这句话理解有问题吗? 但是,用related_name的时候: >>>a = Article.objects.get(id=1) >>>a.tags.all() 问题二,最终得到的明明是Tag表里的对象啊,这就不符合我对上面那句话的理解了。 问题三,a.tags.all()都能得到Tag表的对象,那我不用tag__name啊,我直接写a.tags.filter(name=……)得不到想要的结果吗?
    2020-07-14 21:15:28
提问者 江民川 2020-07-14 22:01:49

最后问题三是我打代码有问题,一并转移到其他地方再请教,这里不再答复。

好帮手慕笑蓉 2020-07-14 17:00:47

同学,你好。第二张图定义related_query_name后,外键对象Article可通过related_query_name的值来反向筛选对象Tag的内容,tag__name="important"表示Article反向筛选对象Tag的name值为important的记录

关于tag和name的双下划线连在一起的意思,老师在“步骤三 · 实战:Django对象关系映射(ORM)4-5”的视频中详细讲解了,双下划线表示查询语法,如:

http://img1.sycdn.imooc.com//climg/5f0d72a40936e85212080096.jpg

同学也可回看视频进行巩固。

祝学习愉快~ 

  • 提问者 江民川 #1
    我懂了,这个related_query_name的值在此用法等效于字段名。 不过,related_query_name只有这个双下划綫用法吗?没有类似“模型.related_name的名称”的用法吗?或者问,related_query_name还有没有其他比较重要的用法? 还有,老师,我在您另一个回答下又问了个问题,请不要漏看了。
    2020-07-14 18:01:03
好帮手慕笑蓉 2020-07-14 16:29:55

同学,你好。related_query_name是目标模型中用于反向筛选器的名称,如果不定义则默认为related_name的值,可以看如下例子:

1、related_name从相关对象返回到此对象要使用的名称,定义related_name之后,可以通过“模型.related_name的名称”访问那些关联了此模型的对象,如:

http://img1.sycdn.imooc.com//climg/5f0d6bd209518cff08380111.jpg

http://img1.sycdn.imooc.com//climg/5f0d6b95099923bd09230107.jpg

关于使用它进行反向查询可看如下例子:

blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries')

通过entries名称进行查询:

 b = Blog.objects.get(id=1)

 b.entries.all()

2、related_query_name定义后,可用定义的名称来反向筛选关联于此模型的模型:

http://img1.sycdn.imooc.com//climg/5f0d6a7f0995190808500397.jpg

如果解决了你的疑惑,请采纳,祝学习愉快~ 

  • 提问者 江民川 #1
    第二张图表达什么意思我还是没看懂
    2020-07-14 16:33:59
  • 提问者 江民川 #2
    tag和name用双下划綫连在一起等于一个值又是什么意思?
    2020-07-14 16:35:46
  • 提问者 江民川 #3
    问题一、通过related_name='entries'名称进行查询: (假设blog=ForeignKey……在class B里) b = Blog.objects.get(id=1) b.entries.all() 查出来是不是:Blog表里id=1的对象 在B表里 根据blog字段 所对应的某对象? 问题二、我现在的理解是,related_name筛选外表条件(如老师写的id=1是被关联的外表的条件)去查询本表,related_query_name则是筛选内表条件(name=important是本表中的条件,filter用此查外表Article)查询外表,请问老师我这样理解对吗,希望老师不要重复理论概念而是根据我说的来点评
    2020-07-14 17:55:08
提问者 江民川 2020-07-14 15:44:57

在后面的课里别人的提问里看到了老师的回答,但还是有不懂的地方

related_name和related_query_name是对关联对象取的名称,related_name用于反向查询时用到的名称,related_query_name用于反向过滤查询时用到的名称,这两个可以一起用,也可以单独用,它们是用于不同查询时用到的名称。

问题——反向查询和反向过滤查询有什么区别,关于不同的查询,能说具体点吗?


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.从网页搭建入门Python Web
  • 参与学习           人
  • 提交作业       218    份
  • 解答问题       3562    个

本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师