【发布时间】:2017-06-24 04:00:14
【问题描述】:
我有点困惑如何在 Django 的 QuerySet 中使用 _set。例如,一个对象博客b,以及由属性entry_set 关联的对象Entry。 b.entry_set.all()是什么意思?
如果有人可以使用此示例显示可能的输出,我将不胜感激。
【问题讨论】:
我有点困惑如何在 Django 的 QuerySet 中使用 _set。例如,一个对象博客b,以及由属性entry_set 关联的对象Entry。 b.entry_set.all()是什么意思?
如果有人可以使用此示例显示可能的输出,我将不胜感激。
【问题讨论】:
您看到的是reverse related object lookup。
在你的例子中:
class Blog(models.Model):
pass
class Entry(..):
blog = Blog(..)
现在,给定Entry 类型的对象e,您将执行e.blog 来访问相关对象Blog - 这是一个正向关系。
_set 是 django 为您提供的反向查找类变量。
所以,给定对象 b - 你会这样做:
entries = b.entry_set.all()
反向是查询集的原因是,ForeignKey 是1-to-many 关系。因此,反向是一个查询集。
_set 对象在 related_name is not specified 时可用。
【讨论】:
简单地说:
假设您有一个模型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,则该模型的实例将可以通过模型的简单属性访问相关的 foreign 对象。
Django 还为关系的“另一端”创建 API 访问器——从相关模型到定义关系的模型的链接。
在这种情况下,Car 对象c 可以通过wheel_set 属性访问所有相关Wheel 对象的列表:c.wheel_set.all()。
如果模型具有ForeignKey,则外键模型的实例将有权访问返回第一个模型的所有实例的Manager。默认情况下,此Manager 被命名为FOO_set,其中FOO 是源模型名称,小写。这个Manager 返回QuerySets,可以过滤和操作。