2013-02-20 5 views
0

Je voudrais avoir une liaison automatique entre deux champs m2m différents. Voici un exemple de mon souhaité flux de travail:Django m2m champ symétrique à un autre champ m2m

  1. créer une marque « verte »
  2. créer une marque « Couleurs » et marquer « vert » comme un enfant
  3. maintenant, quand je vais revenir à « Green "panneau de balise, il doit avoir" Couleurs "entre les parents

Malheureusement, ce n'est pas si simple et je ne peux rien trouver. J'ai essayé de mettre symétrique à vrai, mais il est juste faire boucle inutile (« Green » est pas un parent à « Couleurs »!)

# my models.py 
class Tag(models.Model): 
    ... 
    children = models.ManyToManyField(
     'self', 
     blank=True, 
     related_name="kids", 
     symmetrical=False 
    ) 
    parents = models.ManyToManyField(
     'self', 
     blank=True, 
     related_name="folks", 
     symmetrical=False 
    ) 

Merci pour l'aide.

+0

Si vous faites référence le panneau d'administration de django vous pouvez ajouter une balise à ce sujet. Ce n'est pas un problème M2M. – dmg

+0

Merci, donc je l'ai fait. Mais toujours pas de chance:/ – gwaramadze

+0

Hmm, peut-être que vous devriez regarder dans les formes et la façon de créer des formulaires personnalisés (peut-être étendre ModelForm). Quoi qu'il en soit, les deux M2M sont faux. Ils représentent la même chose. Si vous n'en avez besoin que pour le panneau d'administration, vous pouvez essayer d'ajouter un nouveau modèle 'Parentship' avec 2 clés étrangères à' Tag 'et modifier ces relations là. – dmg

Répondre

0

Je crois que ce que vous essayez de faire peut être accompli avec une seule relation M2M. Découvrez the documentation for symmetrical. Si vous définissez un champ asymétrique, vous pouvez utiliser l'argument related_name pour définir l'autre relation:

class Tag(models.Model): 
    name = models.TextField() 
    children = models.ManyToManyField(
     'self', 
     blank=True, 
     related_name="parents", 
     symmetrical=False 
) 

green = Tag.objects.create(name='green') 
color = Tag.objects.create(name='color') 
color.children.add(green) 
color in green.parents.all() # True 
+0

Merci l'homme, vous avez sauvé la journée! C'était vraiment simple. Une idée comment puis-je représenter le panneau d'administration des parents? Maintenant, je ne peux voir que des enfants. – gwaramadze

+0

Je crois que quelque chose [comme ceci] (http://stackoverflow.com/a/5625036/1810460) devrait fonctionner pour vous. – Hamms

Questions connexes