je le modèle suivant:gestion ManyToManyField à lui-même dans Django
class MyUser(User):
# some fields...
contact = models.ManyToManyField("self", through='Contact', symmetrical=False, related_name="contact_set")
class Contact(models.Model):
user1 = models.ForeignKey(MyUser, related_name="contact_set1")
user2 = models.ForeignKey(MyUser, related_name="contact_set2")
confirmed = models.BooleanField()
et ce point de vue pour créer un contact
def add_contact(request, username=None):
if username:
try:
user = MyUser.objects.get(username=username)
except User.DoesNotExist:
user = None
if user:
contact = Contact(user1 = MyUser.objects.get(pk=request.user.id), user2=user, confirmed=False)
contact.save()
return render_to_response("accounts/add_contact.html", {'user': user,})
else:
return HttpResponseRedirect("/home")
def list_contacts(request, username=None):
if username:
try:
user = MyUser.objects.get(username=username)
except User.DoesNotExist:
user = None
else:
user = MyUser.objects.get(pk=request.user.id)
if user:
contacts = user.contacts.all()
return render_to_response("accounts/list_contacts.html", {'contacts': contacts,})
else:
return HttpResponseRedirect("/home")
Ok maintenant ... le code devrait être assez bavard, je Expliquer brièvement: Réseaux sociaux, les utilisateurs ajoutent d'autres à leurs contacts ("amis", "copains", mais vous l'appelez). Si l'utilisateur A ajoute l'utilisateur B, B est également en contact avec A ...
Le code fonctionne ... mais seulement dans un sens. Si je suis connecté en tant qu'utilisateur A et que je souhaite ajouter l'utilisateur B à mes contacts, B s'affichera sur ma liste de contacts, mais pas l'inverse. Mais je veux aussi apparaître sur la liste de contacts de B - cela ne devrait faire aucune différence, qui a ajouté qui. Comment puis-je gérer cela?
Ref: votre commentaire. Sheesh, bien sûr que tu as raison. Je supprime ma réponse. –
ayant symétrique = True dans le modèle MyUser, les définitions de champ de contact, devrait le faire dans les deux sens? pourquoi est-ce que symétrique est défini sur False? – Ashok
Parce qu'il est dit dans les docs: "Lorsque vous définissez une relation plusieurs-à-plusieurs d'un modèle à lui-même, en utilisant un modèle intermédiaire, vous devez utiliser symmetrical = False" - http://docs.djangoproject.com/fr/ dev/topics/db/models/# intermédiaire-manytomany – craesh