2017-07-06 30 views
1

私は、(モデル定義で)それ自体のための典型的な__str __(自己)値を自動的に構築するためにDjangoモデルを取得しようとしていますが、3 ManyToManyフィールドに基づいています。 (最初の2つのモデルのように)基本的なフィールドタイプを使用する場合とは異なり、これはM2Mフィールドでは機能しないように見えます(3番目のモデルを参照)。 モデルは正常に移行しますが、管理者が参照するとエラーが発生します。Djangoモデルの自己参照M2Mフィールド

ご協力いただきありがとうございます。

class Party(models.Model): 
    name=models.CharField("Party", max_length=150) 
    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

    class Meta: 
     ordering = ('name',) 

class ValCharBehav(models.Model): 
    name=models.CharField("Value/Character/Behaviour", max_length=150, unique=True) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class ValCharBehavWithPeople(models.Model): 
    vcb=models.ManyToManyField(ValCharBehav, verbose_name="Value/Character/Behvaiour") 
    bywhom=models.ManyToManyField(Party, verbose_name="By Whom", blank=True, related_name="valCharByWhomReverseAccessor") 
    towhom=models.ManyToManyField(Party, verbose_name="To Whom", blank=True, related_name="valCharToWhomReverseAccessor") 

    def __str__(self):    # __unicode__ on Python 2 
     return self.vcb.name+": by: "+self.bywhom.name+", to: "+self.towhom.name 

答えて

0
def get_vcb_name(self): 
    return ' | '.join(self.vcb.filter(
     name__isnull=False 
    ).values_list('name', flat=True)) 

def get_bywhom_name(self): 
    return ' | '.join(self.bywhom.filter(
     name__isnull=False 
    ).values_list('name', flat=True)) 

def get_towhom_name(self): 
    return ' | '.join(self.towhom.filter(
     name__isnull=False 
    ).values_list('name', flat=True)) 

def __str__(self):   
    return self.get_vcb_name()+": by: "+self.get_bywhom_name()+", to: "+self.get_towhom_name() 
0

それとも、@ ykhの答えの少しより簡潔なバージョンを好む場合:

def __str__(self): 
    return '%s, by %s, to %s' % [ 
     ' | '.join(x.values_list('name', flat=True)) 
     for x in (self.vcb, self.bywhom, self.towhom) ]