如何在Django模板中显示来自ForeignKey的ManyToManyField字段值?

时间:2013-09-17 20:41:04

标签: django django-models django-templates django-orm

我查看了QuestSet API并尝试找到答案。但我想我错误地解释了管理器和实例之间的区别。

我有以下型号......

class Target(model.Model):
   group = models.ManyToManyField(Group, null=True)
   group_name = models.ManyToManyField(GroupName, null=True)
   ...

class Group(models.Model):
   value = models.CharField(null=True)

为目标模型中的所有ManyToMany关系定义了等等。

现在,我从另一个模型中引用了目标模型本身,如下所示。

class Schedule(models.Model):
   targetID = models.ForeignKey(Target, null=True)
   name = models.CharField(null=True)

在我的Schedule模型模板中,我希望能够显示ForeignKey中引用的ManyToManyFields的值(即Target)。

当我写下以下内容时,

o = Schedule.objects.get(name = 'O_123')
o.targetID --->  This gives me the ID of the ForeignKey field

我希望能够显示目标模型中所有字段的值,并参考名称(即O_123),为此我尝试了以下内容,

o.targetID.group

显示“django.db.models.fields.related.ManyRelatedManager对象位于0x1f2e850”

有人可以帮助我理解我误解了什么。感谢。

1 个答案:

答案 0 :(得分:0)

你有一些误解。

  

o.targetID --->这给了我ForeignKey字段的ID

没有。 o.targetID为您提供与您的ForeignKey相关的实际目标对象。这就是为什么你不应该调用字段anyID:它应该被称为target

现在,这是可能的,因为这是FK关系的多对一方面:即,对于每个计划,只有一个目标。但是从Target到Group,存在着多对多的关系。因此,o.targetID.group指的是许多组(同样,命名约定有助于:您应该将此字段称为groups)。

所以Django给你一个Manager对象:基本上和你Schedule.objects时一样。与后一种情况一样,您可以all()使所有元素迭代,或get(criteria=value)获取特定元素,甚至filter(criteria=value)以获取过滤后的查询集。

在您的情况下,您可能想要:

for group in o.targetID.group.all():
    print group.my_field_value