通过Django中的外键进行查询

Tim*_*Tim 5 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)
Run Code Online (Sandbox Code Playgroud)

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

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

Ign*_*ams 10

User.objects.filter(scientist__experiment__theory__name=u'relativity')
Run Code Online (Sandbox Code Playgroud)


Mat*_*kin 6

看一下关于跨越关系的Lookup的Django文档部分.净外卖是:

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

Ignacio的答案显示了在字段名称上使用双下划线来跨越关系的示例.

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

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