related_query_name和related_name

related_query_name和related_name

老师,我记得之前讲微博的好友关系的时候用的是related_name,现在怎么用related_query_name了,两个有什么区别

正在回答

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

1回答

同学你好:

related_query_name="自定义名" #定义一个反向操作的名称,保留了反向连表操作中_set的属性。

related_name="自定义名" #定义一个反向操作的名称,直接通过自定义名即可反向操作。

related_query_name和related_name都是定义的反向操作的属性,一般常用related_name。

class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, unique=True)
 
    def __str__(self):
        return "我是一个出版社对象:{}".format(self.name)
 
 
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    price = models.DecimalField(max_digits=5, decimal_places=2, default=99.99)
  
    title = models.CharField(max_length=32)
    # 外键
    publisher = models.ForeignKey(
        to="Publisher",
        on_delete=models.CASCADE,
        related_name="books",  # related_name="books" 反向查询是用来代替基于对象查找表名(book_set)的
        related_query_name="xxoo",  # related_query_name="xxoo" 反向查询是用来替代基于下划线查找时的表名的
        null=True
    )

反向查询:

基于对象查找
publisher_obj = models.Publisher.objects.first() 
# 找到第一个出版社对象
books = publisher_obj.book_set.all()  
# 找到第一个出版社出版的所有书
titles = books.values_list("title")  
# 找到第一个出版社出版的所有书的书名    
使用基于对象查找时,前提是对象,其次,模板里的类定义不能有related_name和
related_query_name,两种方式不能并存,会报错

基于下划线查找(用到related_query_name和related_name)
#反向查询id为1的publisher的title。
print(models.Publisher.objects.filter(id=1).values_list("xxoo__title")) #related_query_name
#反向查询id为2的publisher的books对象。
print(models.Publisher.objects.get(id=2).books.first()) # related_neme    
 注意:使用related_name时,前面的还是对象,但是使用related_query_name时,
 前面要是queryset(一个对象的列表)
get得到的是一个模型实例对象,filter得到的是一个queryset对象。

values_list()方法返回一个包含元组的QuerySet

如果我解决了同学的问题,请采纳!学习愉快^_^。

  • xiaoyuan1 提问者 #1
    老师,我是不是可以这么理解,反向关联时,related_query_name前面的是queryset一个对象集合,related_name时,前面的是一个对象
    2020-02-21 19:04:02
  • 好帮手乔木 回复 提问者 xiaoyuan1 #2
    同学你好:同学的理解是正确的,学习愉快^_^。
    2020-02-21 19:04:48
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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