在Django中设置查询集

时间:2017-02-07 02:51:43

标签: django django-queryset

我有点困惑如何在Django的_set中使用QuerySet。例如,对象博客b和属性Entry相关的对象entry_setb.entry_set.all()是什么意思?

如果有人可以使用此示例来显示可能的输出,我将不胜感激。

2 个答案:

答案 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和一个模型WheelWheelCar的外键关系如下:

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

假设wWheel的实例,cCar的实例:

>>> 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,可以对其进行过滤和操作。