5

我的 Django 项目中有两个模型:

  • 匹配
  • 播放器

Match 有一个指向玩家的 ManyToMany 属性,因此多个玩家可以在一场比赛中竞争。我想在 Django 管理员中返回一个信息丰富的对象名称,例如“Richard Henry vs John Doe”,通过使用玩家全名的连接。但是以下失败:

class Match(models.Model):
    players = models.ManyToManyField(Player, verbose_name='Competitors')

    def __unicode__(self):
        return " vs ".join(self.players)

ManyToManyFields 不只是列表吗?为什么我不能加入他们?任何输入表示赞赏。这是我的播放器模型,以防有帮助:

class Player(models.Model):
    full_name = models.CharField(max_length=30)

    def __unicode__(self):
        return "%s" % self.full_name

谢谢!

编辑:我刚刚发现我可以使用self.players.list_display它作为列表返回。我不再吐出回溯,但由于某种原因,__unicode__名称现在返回None. 知道为什么会这样吗?

编辑2:更改代码:

class Match(models.Model):
    players = models.ManyToManyField(Player, verbose_name='Competitors')

    def __unicode__(self):
        return " vs ".join(self.players.list_display)
4

3 回答 3

13

另一种选择是:

return " vs ".join(p.full_name for p in self.players.all())

注意:很抱歉把这个带回来——掘墓人:-)

于 2010-07-08T13:11:20.897 回答
6

“ManyToManyFields 不只是列表吗?”

不。

它们是查询集。哪些类似于列表,但实际上不是列表。

做这个。

return " vs ".join(list(self.players))

list 函数将强制评估查询集并返回一个列表对象。

于 2009-02-24T15:48:44.127 回答
0

不,ManyToManyField 不是一个列表,它只是一个键,并且比赛中的每个玩家都会有一个 Match 实例。

您不想在 __unicode__() 方法中进行查询,因为它很可能会对性能造成很大影响。只需在模板中显示 X 与 Y。

于 2009-02-24T15:50:59.380 回答