2009-12-02 3 views
0

Je rencontre des difficultés avec ce type de données. Scénario est comme suit:Une question de relation d'amitié

  1. user1 ajouter est un ami appelé utilisateur2
  2. utilisateur2 confirme que user1 est son ami

ce qui devrait arriver est user2 et user1 voir de chacun d'autres noms dans leur liste amis . Ce qui se passe maintenant, c'est que je peux ajouter la liste d'amis user2 à user1 mais user1 ne peut pas voir user2 dans sa liste. Ma question est de savoir comment j'obtiens user1 à apparaître dans la liste de user2 et user2 pour montrer dans la liste d'amis de user1 si un utilisateur a confirmé l'amitié? J'étais en pensant à l'utilisation de l'état de confirmation dans le modèle et parce que que id de l'utilisateur1 et user2 est à la fois dans la relation confirmée I ne voient pas de problèmes d'intégrité ici. Des conseils?

modèle d'amitié:

class Friendship(models.Model): 
     NOT_CONFIRMED = 1 
     PENDING= 2 
     CONFIRMED = 3 

     STATUS_CHOICES = (
       (NOT_CONFIRMED, 'Not Confirmed'), 
       (PENDING, 'Pending'), 
       (CONFIRMED, 'Confirmed'), 
     ) 
     from_friend = models.ForeignKey(User, related_name='friend_set') 
     to_friend = models.ForeignKey(User, related_name='to_friend_set') 
     confirmed = models.IntegerField(choices=STATUS_CHOICES, 
default=NOT_CONFIRMED) 

     class Meta: 
       unique_together = (('to_friend', 'from_friend'),) 

     def __unicode__(self): 
       return '%s, %s' % (self.from_friend.username, 
self.to_friend.username) 

Vues pour rendre les amitiés (comme vous pouvez le voir, je joue avec le filtrage):

@login_required 
def friends_list(request, username): 
     user = get_object_or_404(User, username=username) 
     #friends = [friendship for friendship in user.friend_set.filter(Q 
(confirmed=2) | Q(confirmed=3))] 
     friends = Friendship.objects.filter(
       Q(to_friend=user) | Q(confirmed=3) 
     ) 

     # get friends latest 10 shows 
     friend_shows = Show.objects.filter(user__in=friends).order_by('-id') 
     return render_to_response('habit/friends_list.html', { 
       'user': request.user, 
       'friends': friends, 
       'shows': friend_shows[:10], 
       'username': username, 
     }) 

Répondre

1

Il est pas évident que votre modèle d'amitié est associatif. Est-ce que mes amis listent la liste de toutes les amitiés dans lesquelles je suis le from_user? Ou est-ce toutes les amitiés dans lesquelles je suis soit le from_user ou le to_user? Si c'est le premier, alors chaque relation d'ami est représentée par deux objets d'amitié, l'un indiquant que vous êtes mon ami, et l'autre indiquant que je suis votre ami. Chaque fois qu'un utilisateur fait une demande, vous ajouterez deux amitiés. Le statut indiquera si la personne faisant la demande est le from_user ou le to_user. Et lorsqu'une demande est confirmée ou rejetée, vous mettez à jour les deux amitiés pour refléter cela.

Si c'est le dernier, alors chaque relation d'ami est représentée par un seul objet d'amitié. Dans ce cas, la conception de votre objet devra enregistrer quel ami dans la relation a fait la demande, de sorte que lorsque vous examinez l'objet, vous puissiez dire quel utilisateur peut transformer la demande en une amitié confirmée.

0

Sur la base de cette page: http://docs.djangoproject.com/en/dev/topics/db/queries/

Le code suivant:

friends = Friendship.objects.filter(
     Q(to_friend=user) | Q(confirmed=3) 
) 

équivaut à: to_friend = user OR confirmed = 3. Ce qui n'est probablement pas ce que vous voulez, basé sur votre description.

Cela ressemble plus à ce que vous voulez:

friends = Friendship.objects.filter(
     Q(to_friend=user) | Q(from_friend=user) 
     , Q(confirmed=3) 
) 
Questions connexes