2017-07-07 3 views
0

Est-il possible d'obtenir les valeurs d'un objet ManyToMany à partir d'un objet sans utiliser' for '?Champ Django ManyToMany obtenir toutes les valeurs d'un objet sans '

models.py

class Citizenship(models.Model): 
    name = models.CharField(max_length=100) 

    class Meta: 
     verbose_name_plural = "Citizenship" 

    def __str__(self): 
     return self.name 

class Anexa(models.Model): 
    name = models.CharField(max_length=150, help_text="3") 
    citizenship = models.ManyToManyField(Citizenship, help_text="4") 

je un objet Anexa avec le nom Alex et j'ai 4 citoyennetés pour cet objet. Je cherche quelque chose d'équivalent à ceci:

for citizenships in x.citizenship.all(): 
    print(citizenships.name) 
+2

Une raison (s) pourquoi vous n'avez pas voulez-vous utiliser un * pour *? –

+0

il est difficile de répondre à la question sans savoir pourquoi vous ne voulez pas utiliser une boucle 'for'. cela n'a pas de sens – Anentropic

+0

Parce que je fais un pdf avec reportlab et qu'il dessine 4 fois la même propozition, j'ai seulement besoin des valeurs de l'objet. 4 valeurs dans une propozition. –

Répondre

0

Ce fut la réponse:

print(', '.join(x.citizenship.values_list('name', flat=True)) 
3

Le plus proche que vous obtiendrez est une liste de valeurs https://docs.djangoproject.com/en/1.11/ref/models/querysets/#values-list, que vous auriez encore à travers la boucle pour imprimer individuellement.

x.citizenship.values_list('name', flat=True) 
+1

Vous n'avez pas besoin d'une boucle for pour l'imprimer: 'print (',' .join (x.citizenship.values_list ('nom', flat = True))' devrait fonctionner correctement –

+0

exemple dans lequel il est apparu qu'ils voulaient chacun imprimé par eux-mêmes sur une nouvelle ligne ou pour pouvoir les utiliser individuellement dans un code ultérieur.Enfin si vous voulez juste les voir, vous pouvez simplement imprimer le résultat de la liste des valeurs – martinB0103

+1

Vous pouvez utiliser '' \ n.join (...) 'pour insérer des sauts de ligne à la place –

1

Si vous voulez abstraire la vous boucle pouvez créer une méthode sur le modèle:

class Anexa(models.Model): 
    def print_citizens_names(self): 
     for name in self.citizenship.values_list('name', flat=True): 
      print(name) 

Ensuite, dans votre base de code que vous pouvez tout faire:

x.print_citizens_names()