В Django нельзя ли использовать соединение строк в ManyToManyField? ManyToMany - это не просто список?

В моем проекте Django есть две модели:

  • Соответствие
  • Игрок

Match имеет свойство ManyToMany, указывающее на игроков, так что в матче могут участвовать несколько игроков. Я хотел бы вернуть информативное имя объекта в админке Django, например, «Ричард Генри против Джона Доу», используя соединение полных имен игроков. Однако следующее не удается:

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)

Ответов (3)

Нет, ManyToManyField - это не список, это всего лишь один ключ, и для каждого игрока в матче будет один экземпляр Match.

Вы не хотите выполнять запрос в методе __unicode __ (), потому что это, скорее всего, сильно снизит производительность. Просто отобразите X против Y в своем шаблоне.

«Неужели ManyToManyFields - это не просто списки?»

Нет.

Это наборы запросов . Которые похожи на списки, но не на самом деле списки.

Сделай это.

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

Функция списка принудительно выполнит оценку набора запросов и вернет объект списка.

Другой вариант:

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

Примечание: извините за то, что вернул это - могильщик :-)