2010-12-01 42 views
1

J'ai une relation M2M récursive avec une classe d'indicateur. Un indicateur est un int, ou une valeur calculée à partir de 2 indicateurs:Pourquoi cette relation many-to-many change-t-elle sans que je le demande, en utilisant l'ORM de Django?

class Indicator(models.Model): 


    params = models.ManyToManyField('self', 
           verbose_name=__(u'parameters'), 
           related_name='params_of', 
           blank=True, null=True) 

    type = models.CharField(max_length=64, verbose_name=__(u'type')) 

    def get_value(self, record): 

     # etc 

Selon le type, get_value ne fait pas les mêmes choses. Il peut simplement renvoyer la valeur numérique ou calculer une valeur à partir de la valeur numérique de chaque paramètre à partir de l'attribut params. Comme vous pouvez le voir params est une relation récursive m2m.

Maintenant, mon problème est que, je les indicateurs follwoing:

  • hommes
  • femmes
  • pop totale
  • ratio
  • hommes

Si j'ajoute men et women comme paramètres de total pop, tout va bien, et je calcule dynamiquement mon pop total até. Mais si je puis ajouter men et total pop comme paramètres à men ratio, alors total pop obtiennent automatiquement men ratio en tant que paramètre. Ça casse tout.

Pourquoi est-ce? Comment puis-je l'éviter?

Répondre

3

Les relations M2M dans Django sont symétriques par défaut, c'est-à-dire dans un M2M, si une relation avec b, alors b est également liée à a. Pour arrêter cela, utilisez symmetrical=False

votre params deviendrait:

params = models.ManyToManyField('self', 
           verbose_name=__(u'parameters'), 
           related_name='params_of', 
           blank=True, null=True, 
           symmetrical=False) 
+0

Merci homme, qui aide beaucoup. –