通过Django中的外键进行查询

时间:2010-07-29 18:28:51

标签: django django-models

如何在Django中浏览多个外键?我已经尝试过django docs中我能想到的一切,但我显然错过了一些东西(极端新手)。我有科学家,实验和理论的模型。

如果我想查看一个特定的理论(我们称之为“相对论”)并获得所有使用它的科学家的电子邮件列表(保存在正常的django用户模型中),我该如何做?


class Experiment(models.Model)

    experimenter = models.ForeignKey(Scientist)
    theory = models.ForeignKey(Theory)


class Theory(models.Model)

    name = models.CharField(max_length=100)

class Scientist(models.Model)

    user = models.ForeignKey(User, unique=True)
    institution = models.CharField(max_length=20, null=True, blank=True)

这些是我重写的模型的简化版本,因此可能存在一些错误,但关系是正确的。

我已经尝试了select_related(),get(),filter()的各种组合,但无法弄明白。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:10)

User.objects.filter(scientist__experiment__theory__name=u'relativity')

答案 1 :(得分:6)

查看关于Lookups that span relationships的Django文档部分。净外卖是:

  

要跨越关系,只需使用跨模型的相关字段的字段名称,用双下划线分隔,直到到达所需的字段。

Ignacio's answer显示了在字段名称上使用双下划线来跨越关系的示例。

Django文档的另一个相关部分是Related objects部分。 Django中的关系在访问方式上是不对称的。前向/正常关系作为模型的属性被访问。访问向后关系:

  

Django还为关系的“其他”方创建API访问器 - 从相关模型到定义关系的模型的链接。例如,Blog对象b可以通过entry_set属性访问所有相关Entry对象的列表:b.entry_set.all()。