related_query_name和related_name
老师,我记得之前讲微博的好友关系的时候用的是related_name,现在怎么用related_query_name了,两个有什么区别
32
收起
正在回答
1回答
同学你好:
related_query_name="自定义名" #定义一个反向操作的名称,保留了反向连表操作中_set的属性。
related_name="自定义名" #定义一个反向操作的名称,直接通过自定义名即可反向操作。
related_query_name和related_name都是定义的反向操作的属性,一般常用related_name。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 ) |
反向查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 基于对象查找 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
如果我解决了同学的问题,请采纳!学习愉快^_^。
3.从网页搭建入门Python Web
- 参与学习 人
- 提交作业 218 份
- 解答问题 3562 个
本阶段带你用Python开发一个网站,学习主流框架Django+Flask是Python Web开发的第一步,在基础知识上实现积分商城的项目开发,体验真实的项目开发流程,提高解决编程问题和效率的能力。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧