我有点困惑如何在Django的_set
中使用QuerySet
。例如,对象博客b
和属性Entry
相关的对象entry_set
。 b.entry_set.all()
是什么意思?
如果有人可以使用此示例来显示可能的输出,我将不胜感激。
答案 0 :(得分:22)
您看到的是reverse related object lookup。
在你的例子中:
class Blog(models.Model):
pass
class Entry(..):
blog = Blog(..)
现在,给定e
类型的对象Entry
,您可以e.blog
访问相关对象Blog
- 这是一个前向关系。
_set
是django为您提供的反向查找类变量。
所以,给定对象b
- 你会这样做:
entries = b.entry_set.all()
反向是查询集的原因是,ForeignKey是1-to-many
关系。因此,反向是查询集。
related_name
is not specified时,_set
对象可用。
答案 1 :(得分:6)
简要说来:
假设您有一个模型Car
和一个模型Wheel
。 Wheel
与Car
的外键关系如下:
class Car(models.Model):
pass
class Wheel(models.Model):
car = models.ForeignKey(Car, on_delete=models.CASCADE) # on_delete parameter is mandatory in Django 2.0
假设w
是Wheel
的实例,c
是Car
的实例:
>>> w.car # returns the related Car object to w
>>> c.wheel_set.all() # returns all Wheel objects related to c
详细说明
使用上面定义的模型,Wheel
对象w
可以通过访问Car
属性获取其关联的car
对象:w.car
。
如果模型具有ForeignKey
,则该模型的实例将通过模型的简单属性访问相关的外部对象。
根据官方Django documentation:
Django还为关系的“其他”方创建API访问器 - 从相关模型到定义关系的模型的链接。
在这种情况下,Car
对象c
可以通过Wheel
属性访问所有相关wheel_set
个对象的列表:c.wheel_set.all()
。
如果模型具有ForeignKey
,则外键模型的实例将有权访问返回第一个模型的所有实例的Manager
。默认情况下,此Manager
名为FOO_set
,其中FOO
是源型号名称,小写。此Manager
会返回QuerySets
,可以对其进行过滤和操作。