2017-07-07 64 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() 
相关问题