【问题标题】:Django Many to Many display values, not objectDjango多对多显示值,而不是对象
【发布时间】:2011-09-18 15:34:37
【问题描述】:

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

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

我正在尝试将“名称”的所有条目显示到视图中,但我目前仅返回

只有在查看页面源代码时才能看到。否则它看起来就像一个空白的白色屏幕。

视图如下:

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

我显然在这里返回了错误的东西,但我已经寻找另一种方法来做到这一点,但我发现似乎没有任何效果。这是我发现返回错误以外的任何内容的唯一方法,所以我认为这是最好的发布方式。

非常感谢

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

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

    因此,您需要做的第一件事就是改变获取人员的方式。

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

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

    现在,currentTrial.person 实际上是一个 ManyToMany 经理,可以迭代,因为我们可以有很多人参加 Trial。所以我们应该调整变量名,让它更有意义。

    persons = currentTrial.person.all()
    

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

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

    希望有帮助!

    【讨论】:

    • 谢谢。为了清楚起见,我注意到您将我的 currentTrial = Trial.objects.get(id=1) 更改为 currentTrial = Trial.objects.get(pk=1) 。在这种情况下使用 pk vs id 有什么意义吗?
    • pk 是主键的别名,无论调用什么主键都可以使用。默认情况下,主键称为id,但不一定是这种情况。虽然在您自己的项目中使用 id 很好(当您知道名称将是 id 时),但使用 pk 是一种很好的做法,因为它使您的代码更具可移植性。
    【解决方案2】:

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

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

    如果您真的是恶意的人,我建议您更改名称,但实际上您会得到一个类似查询集的对象。您可以通过person.all() 获取所有信息,或通过person.filter(something=value) 获取与试验相关的部分人员。

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

    祝你好运!

    【讨论】:

    • 嘿,几乎同时得到相同的答案!为您 +1 :-)
    猜你喜欢
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多