2010-02-28 1 views
2

contient un modèle comme celui-ci:Mes champs manytomany de Django sont tous marqués uniques, y at-il une option pour enlever ceci?

class A(models.Model): 
    def __unicode__(self): 
     return "%d"%self.id 

class B(models.Model): 
    a_set = models.ManyToManyField(A) 

    def __unicode__(self): 
     return "%d"%self.id 

Puis la série suivante d'opérations démontre mon problème:

In [1]: a1=A() 
In [2]: a1.save() 
In [3]: a1 
Out[3]: <A: 1> 

In [4]: b1=B() 
In [5]: b1.save() 
In [6]: b1 
Out[6]: <B: 1> 

In [7]: b2=B() 
In [8]: b2.save() 
In [9]: b2 
Out[9]: <B: 2> 

In [10]: a1.b_set.add(b1) 
In [11]: a1.b_set.all() 
Out[11]: [<B: 1>] 

In [12]: a1.b_set.add(b2) 
In [13]: a1.b_set.all() 
Out[13]: [<B: 1>, <B: 2>] 

In [14]: a1.b_set.add(b2) 
In [15]: a1.b_set.all() 
Out[15]: [<B: 1>, <B: 2>] 

A la fin, ce que je veux voir est:

Out[15]: [<B: 1>, <B: 2>, <B: 2>] 

Répondre

2

Vous pouvez créer un troisième tableau:

class JoinModel(models.Model): 
    a = models.ForeignKey(A) 
    b = models.ForeignKey(B) 

Je crois que cela vous permettra de créer un certain nombre de relations entre les instances de A et B.

+0

ok, cela a du sens, mais j'ai quelques endroits où cela se produit, donc s'il y a un moyen de le faire sans créer manuellement les tables de relations, alors ce serait préférable –

0

La définition de la relation ManyToMany dans le contexte relationnel est qu'il représente une fonction sur le sous-ensemble du produit des deux d'origine les espaces. Donc, pour chaque paire d'entités, il y a au plus une relation dans le M2M associant la paire.

Tous les générateurs de schéma ORM principaux créent en fait un composite PK ou UniqueKey sur la table de jointure, pour forcer cela.

Si vous voulez sauter par-dessus, vous devez éviter d'utiliser ManyToMany, et utiliser une table explicite pour faire la jointure.

Questions connexes