2010-09-27 9 views
1

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?

+0

Ref: votre commentaire. Sheesh, bien sûr que tu as raison. Je supprime ma réponse. –

+0

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

+0

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

Répondre

1

Docs. Docs dit de passer "soi" (comme une chaîne de caractères).

Voir aussi question.

Bonne chance. J'espère que tu réussiras dans le développement.

Questions connexes