J'ai ce modèle:Django comment créer une relation "super symétrique" sur une auto relation ManyToMany
class People(models.Model):
name = models.CharField(max_length=128, db_index=True)
friends = models.ManyToManyField('self')
Alors friends
relation est symétrique. Donc, si vous êtes mon ami, je suis votre ami.
Ce que j'aimerais aussi, c'est que tous les amis de mes amis soient automatiquement mes amis. Exemple:
Si A et B sont amis (AB, BA) et que nous ajoutons un nouvel ami C à B, C sera automatiquement ajouté à A (AB, BA, BC, CB, AC, CA). Si nous supprimons C de B, C sera automatiquement retiré de A.
J'ai besoin que cela fonctionne dans une page d'administration normale. Lors de la soumission d'un formulaire, pour un ManyToManyField, Django appelle d'abord clean()
, en effaçant toutes les relations liées à l'instance en cours, puis add()
, en ajoutant toutes les relations provenant du formulaire.
j'ai pu obtenir le bon comportement lors de l'ajout d'une nouvelle relation avec ce code (mais il ne fonctionne pas lors de la suppression relation):
def add_friends(sender, instance, action, reverse, model, pk_set, **kwargs):
if action == 'post_add':
if len(pk_set) > 1:
pk = pk_set.pop()
next = People.objects.get(pk=pk)
next.friends.add(*pk_set)
m2m_changed.connect(add_friends, sender=People.friends.through)
Lors de la recherche de solutions, j'ai du mal à ne pas créer une boucle infinie.