为什么不用_set
related_name和related_query_name的区别
related_name
将成为相关对象的属性,允许您使用外键对模型进行“倒退”。例如,如果ModelA
有像下面这样的字段,那么model_b = ForeignKeyField(ModelB, related_name='model_as')
这将使您能够通过去访问ModelA
与您的ModelB
实例相关的实例model_b_instance.model_as.all()
。请注意,这通常是用复数形式编写的外键,因为外键是一对多关系,并且该等式的许多方面是具有在其上声明的外键字段的模型。
文档中进一步的解释是有帮助的。https://docs.djangoproject.com/en/1.10/topics/db/queries/#backwards-related-objects
related_query_name
用于Django查询集。它允许您过滤外键相关字段的反向关系。为了继续我们的例子 - 将一个字段设置Model A
为: model_b = ForeignKeyField(ModelB, related_query_name='model_a')
将使您可以model_a
用作查询集中的查找参数,如:ModelB.objects.filter(model_a=whatever)
。使用单数形式更常见related_query_name
。正如文档所说,没有必要指定两者(或其中之一)related_name
和related_query_name
。Django具有合理的默认值。
# 统计出每个出版社买的最便宜的书的价格
ret=models.Publisher.objects.first().book_set.all()
ret=models.Publisher.objects.get(id=1).books.all()
book_set可以用books代替related_name用在get上
ret=models.Publisher.objects.filter().annotate(c=Min('zhangzhao__price')).values('name','zhangzhao__title','c')
print(ret)
book_set可以用books代替related_query_name用在filter上