2017-07-06 6 views
1

J'essaie d'obtenir un modèle Django pour construire automatiquement une valeur __str __ (self) typique pour lui-même (dans la définition du modèle), mais basée sur 3 ManyToMany Fields. Contrairement à l'utilisation des types de champs de base (comme dans les deux premiers modèles), cela ne semble pas fonctionner pour les champs M2M (voir le troisième modèle). Le modèle migre correctement, mais provoque des erreurs lorsqu'il est référencé dans l'admin.Modèle Django auto-référencé Champ M2M

Toute aide très appréciée, merci!

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 

Répondre

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

Ou si vous préférez une version un peu plus laconique de la réponse de @ 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) ]