我正在使用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)
我显然在这里回复了错误的东西,但是我已经用另一种方式来做这件事,而我发现的任何东西似乎都没有用。这是我发现返回错误以外的唯一方法,所以我认为这是发布的最佳方式。
非常感谢
答案 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.person
或trial.person
,具体取决于您感兴趣的试用版。
其次,你已经为这个人使用了多对多的字段。这意味着你可以让多个人与一个试验相关联 - 它会更清楚地命名为“人”。
如果你真的是指人们,我建议更改名称,但实际上你会得到一个类似查询集的对象。您可以person.all()
全部获取,或person.filter(something=value)
获取与试用相关的人员的子集。
如果您的意思是“人”(与试验相关的单个主持人),那么您应该使用ForeignKey字段。这会将单个人与可以使用currentTrial.person访问的试验相关联。
祝你好运!