多个反向外键遍历

时间:2013-07-26 00:44:17

标签: django django-models

我有几个表在一个方向上一对多:

class ShiftGroup(models.Model):
    def getJobType(self):
        ???

class Shift(models.Model):
    shift_group = models.ForeignKey(ShiftGroup, related_name="shifts")

class Run(models.Model): 
    shift = models.ForeignKey(Shift, related_name="runs")

class Job(models.Model):
    run = models.ForeignKey(Run, related_name="jobs", blank=True, null=True)
    job_type = models.ForeignKey(JobType, related_name="jobs")

在我看来,我正在提取一个ShiftGroups的查询集以显示在表中,但我还需要显示job_type。我知道我可以使用

从轮班中提取信息
ShiftGroup.shifts.all()

但有没有办法打电话

ShiftGroup.shifts.runs.jobs.job_types

在视图或模板中而不需要嵌套for循环?

2 个答案:

答案 0 :(得分:1)

你提出的问题没有意义。如您所知,每个ShiftGroup都有多个班次,每个班次都有多个班次,如此。因此,ShiftGroup没有“job_type”这样的东西:有很多。

如果您要求在当前ShiftGroup中轮班运行的作业中的所有job_types列表,那么您应该从JobType开始,并使用双下划线语法:

JobType.objects.filter(job__run__shift__shift_group=self)

但同样,这是一个列表的工作类型,而不是一个。如果所有这些关系只能在只有一个单一作业类型的情况下结束,那么您的数据建模就会出现问题:或许您应该有一个从ShiftGroup到JobType的直接ForeignKey。

答案 1 :(得分:0)

在模板中,您可以执行以下操作:

{% for shift in shiftgroups.shift_set.all %}
  {% for run in shift.run_set.all %}
    {% for job in run.job_set.all %}
      {{ job.job_type }}
    {% endfor %}
  {% endfor %}
{% endfor %}

如果您有很多对象,这可能会有些昂贵。