Django多对多显示值,而不是对象

时间:2011-09-18 15:34:38

标签: django django-models django-views

我正在使用Django 1.3,有以下两个模型:

class Person(models.Model):
    name = models.CharField(max_length=500)
    def __unicode__(self):
        return self.name

class Trial(models.Model):
    person = models.ManyToManyField(Person, blank=True)
    strId = str(id)
    def __unicode__(self):
        return self.strId

我正在尝试向视图显示“name”的所有条目,但我目前只返回< django.db.models.fields.related.ReverseManyRelatedObjectsDescriptor对象,位于0x1019b45d0>

我只能在查看Page Source时看到。否则它看起来就像一个空白的白色屏幕。

观点如下:

def trial_entry(request, trial):
    currentTrial = Trial.objects.get(id = 1)
    personName = Trial.person
    return HttpResponse(personName)

我显然在这里回复了错误的东西,但是我已经用另一种方式来做这件事,而我发现的任何东西似乎都没有用。这是我发现返回错误以外的唯一方法,所以我认为这是发布的最佳方式。

非常感谢

2 个答案:

答案 0 :(得分:4)

这里有一些错误。首先,personName未访问Trial的任何实际实例,而只是获取有关person类中Trial属性的信息。

所以你需要做的第一件事就是改变你取得人的方式。

currentTrial = Trial.objects.get(pk=1)
personName = currentTrial.person

你看到有什么不同吗?我在此视图中访问currentTrial,这是您正在处理的Trial类的实例。到目前为止有道理吗?

现在,currentTrial.person实际上是一个ManyToMany管理器,可以迭代,因为我们可以在审判中有很多人。所以我们应该调整变量名称以使其更有意义。

persons = currentTrial.person.all()

您可以更进一步,只需将currentTrial发送到模板上下文,然后访问模板中的试用人员,如下所示:

{% for person in currentTrial.person.all %}
      {{ person }}
{% endfor %}

希望有所帮助!

答案 1 :(得分:2)

首先,Trial.person是试验模型本身(类)的参考,而不是其实例。您应该将其写为currentTrial.persontrial.person,具体取决于您感兴趣的试用版。

其次,你已经为这个人使用了多对多的字段。这意味着你可以让多个人与一个试验相关联 - 它会更清楚地命名为“人”。

如果你真的是指人们,我建议更改名称,但实际上你会得到一个类似查询集的对象。您可以person.all()全部获取,或person.filter(something=value)获取与试用相关的人员的子集。

如果您的意思是“人”(与试验相关的单个主持人),那么您应该使用ForeignKey字段。这会将单个人与可以使用currentTrial.person访问的试验相关联。

祝你好运!