我有几个表在一个方向上一对多:
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循环?
答案 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 %}
如果您有很多对象,这可能会有些昂贵。