Domanda

Sto avendo difficoltà con la vendita di questo tipo di dati. scenario è come segue:

  1. user1 aggiungere un amico chiamato user2
  2. user2 user1 conferma che è il suo amico

quello che dovrebbe accadere è user2 user1 e vedere di ogni altri nella loro nome lista di amici. Quello che sta succedendo ora è che io sono in grado di aggiungere user2 all'Utente1 Elenco di amici ma Utente1 non possono vedere utente2 nel suo / sua lista. La mia domanda è come ottengo user1 di presentarsi in lista e user2 dell'Utente2 di presentarsi in lista di amici di user1 se un utente ha confermato l'amicizia? ero pensando di utilizzare lo stato di conferma nel modello e perché che Utente1 e Utente2 di id è sia nel rapporto che ho confermato Non vedo alcun problemi di integrità qui. Eventuali suggerimenti?

Amicizia modello:

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)

Visualizzazioni per rendere le amicizie (come potete vedere, ho giocato con il filtraggio):

@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,
        })
È stato utile?

Soluzione

Non è ovvio che il vostro modello di amicizia è associativa. Si elencano i miei amici l'elenco di tutte le amicizie in cui io sono il from_user? O è tutte le amicizie in cui io sono sia il from_user o to_user?

Se è la prima, allora ogni rapporto amico è rappresentato da due oggetti di amicizia, uno che indica che sei mio amico, e uno che indica che io sono tuo amico. Ogni volta che un utente effettua una richiesta, ti verrà aggiungendo due amicizie. Lo stato indicherà se la persona che fa la richiesta è la from_user o to_user. E quando una richiesta viene confermata o respinta, si aggiorna entrambe le amicizie per riflettere questo.

Se è quest'ultimo, allora ogni rapporto amico è rappresentata da un singolo oggetto amicizia. In questo caso, il vostro disegno oggetto avrà bisogno di segnare i amico nel rapporto ha presentato la domanda, in modo che quando si esamina l'oggetto si può dire che l'utente può trasformare la richiesta in un'amicizia confermata.

Altri suggerimenti

Sulla base di questa pagina: http://docs.djangoproject.com / it / dev / argomenti / db / query /

Il seguente codice:

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

equivale a: to_friend = user OR confirmed = 3. Che probabilmente non è quello che volete, in base alla descrizione.

Questo sembra più vicino a ciò che si vuole:

friends = Friendship.objects.filter(
        Q(to_friend=user) | Q(from_friend=user)
      , Q(confirmed=3)
)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top