2017-07-07 81 views
0

是否可以在不使用'for'的情況下從對象獲取ManyToMany的值?Django ManyToMany字段獲取來自沒有'for'的對象的所有值

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") 

我與名稱亞歷一個Anexa對象和我有4個國籍此對象。我在尋找這東西相當於:

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

任何原因(s)你爲什麼不想要使用*爲*? –

+0

不知道你爲什麼不想使用'for'循環就很難回答這個問題。這是沒有意義的 – Anentropic

+0

因爲我使用reportlab製作pdf,並且它繪製了4次相同的propozition,我只需要對象中的vales。 4個值在一個propozition中。 –

回答

0

這是答案:

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

你會得到最接近的是一個值列表https://docs.djangoproject.com/en/1.11/ref/models/querysets/#values-list,你仍然要遍歷單獨打印。

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

你不需要一個for-loop來打印它:'print(','.join('x.citizenship.values_list('name',flat = True))'應該可以正常工作。 –

+0

我打算關閉例如,他們希望每個人都自己打印一個新行,或者可以在後面的代碼中單獨使用它們。最後,如果你只想看到它們,你可以打印values_list的結果 – martinB0103

+1

你可以使用'' \ n'.join(...)'代替插入換行符。 –

1

如果你想抽象掉循環,你可以在模型建立方法:

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

然後在你的代碼庫中你可以這樣做:

x.print_citizens_names() 
相關問題