2009-02-24 7 views
4

J'ai deux modèles dans mon projet Django:Dans Django, ne pouvez-vous pas utiliser une jointure de chaîne sur ManyToManyField? ManyToMany n'est-il pas juste une liste?

  • match
  • Joueur

match a une propriété ManyToMany pointant les joueurs, de sorte que plusieurs joueurs peuvent participer à un match. Je voudrais retourner un nom d'objet informatif dans l'admin Django, quelque chose comme "Richard Henry vs John Doe", en utilisant une jointure sur les noms complets des joueurs. Toutefois, les échecs suivants:

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

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

Les champs ManyToManyField ne sont-ils pas simplement des listes? Pourquoi je ne peux pas les rejoindre? Toute contribution est appréciée. Voici mon modèle de joueur, en cas de panne qui aide:

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

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

Merci!

Édition: Je viens de découvrir que je peux utiliser self.players.list_display pour que cela renvoie une liste. Je ne crache plus de traceback, mais pour une raison inconnue, le nom __unicode__ renvoie maintenant None. Une idée de pourquoi cela serait?

Edit 2: code modifié:

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

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

S. Lott: vient de publier 'modifier 2'. – rmh

Répondre

6

"? Est-ManyToManyFields pas de listes juste"

n °

Ils sont querysets. Ce sont des listes, mais pas des listes.

Pour ce faire.

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

La fonction de liste force l'évaluation de l'ensemble de requêtes et renvoie un objet de liste.

0

Non, ManyToManyField n'est pas une liste, c'est juste une seule clé et il y aura une occurrence de Match pour chaque joueur dans la partie.

Vous ne voulez pas faire une requête dans la méthode __unicode __() car il s'agira très probablement d'un grand succès en termes de performances. Il suffit d'afficher le X contre Y dans votre modèle.

11

Une autre option est:

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

Note: Désolé pour amener ce retour - :-) fossoyeur

Questions connexes