No Django, você não pode usar uma corda juntar-se em um ManyToManyField? ManyToMany não é apenas uma lista?

votos
4

Eu tenho dois modelos em meu projeto Django:

  • Combine
  • Jogador

Jogo tem uma propriedade ManyToMany apontando para os jogadores, para que vários jogadores podem competir em uma partida. Eu gostaria de retornar um nome de objeto informativo no admin, algo como Richard Henry vs John Doe, usando uma junção de nomes completos dos jogadores. No entanto, a seguinte falha:

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

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

São ManyToManyFields não apenas listas? Por que não pode se juntar a eles? Qualquer entrada é apreciada. Aqui é o meu modelo de jogador, incase que ajuda:

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

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

Obrigado!

Editar : Eu só descobri que posso usar self.players.list_displaypara ter este retornados como uma lista. Estou não cuspiu um rastreamento, mas por algum motivo o __unicode__nome agora retorna None. Alguma idéia de por que seria?

Editar 2 : Mudou código:

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

    def __unicode__(self):
        return  vs .join(self.players.list_display)
Publicado 24/02/2009 em 16:41
fonte usuário
Em outras línguas...                            


3 respostas

votos
11

Outra opção é:

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

Nota: Desculpe por trazer isso de volta - coveiro :-)

Respondeu 08/07/2010 em 14:11
fonte usuário

votos
6

"São ManyToManyFields não apenas lista?"

Não.

Eles são querysets . Que são lista-like, mas na verdade não lista.

Faça isso.

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

A função lista irá forçar a avaliação do conjunto de consulta e retornar um objeto lista.

Respondeu 24/02/2009 em 16:48
fonte usuário

votos
0

Não, ManyToManyField não é uma lista, é apenas uma única chave e haverá uma instância do jogo para cada jogador no jogo.

Você não quer fazer uma consulta no método __unicode __ (), porque ele provavelmente será um grande sucesso desempenho. Apenas exibir o X vs. Y no seu modelo.

Respondeu 24/02/2009 em 16:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more