Вопрос дружеских отношений - PullRequest
1 голос
/ 03 декабря 2009

У меня проблемы с перечислением данных такого типа. Сценарий следующим образом:

  1. user1 добавляет друга по имени user2
  2. user2 подтверждает, что user1 - его друг

что должно произойти, если user2 и user1 увидят имена друг друга в своих список друзей. Что происходит сейчас, я могу добавить user2 в user1 список друзей, но user1 не может видеть user2 в своем списке. Мой вопрос Как я могу получить user1, чтобы показать в списке user2 и user2, чтобы показать в списке друзей user1, если пользователь подтвердил дружбу? я был думать об использовании статуса подтверждения в модели и потому что идентификатор user1 и user2 находятся в подтвержденных отношениях I не вижу здесь никаких проблем с целостностью. Любые советы?

Модель дружбы:

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)

Просмотры для отображения дружеских отношений (как вы можете видеть, я играл с фильтрацией):

@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,
        })

Ответы [ 2 ]

1 голос
/ 03 декабря 2009

Не очевидно, что ваша модель дружбы ассоциативна. Список моих друзей - список всех друзей, в которых я являюсь from_user? Или это все дружба, в которой я либо from_user, либо to_user?

Если это первое, то каждое отношение к другу представлено двумя объектами дружбы, один указывает, что вы мой друг, а другой указывает, что я ваш друг. Всякий раз, когда пользователь делает запрос, вы будете добавлять двух друзей. Статус будет указывать, является ли человек, делающий запрос, from_user или to_user. И когда запрос будет подтвержден или отклонен, вы обновите обе дружбы, чтобы отразить это.

Если это последнее, то все дружеские отношения представлены одним объектом дружбы. В этом случае ваш объектный дизайн должен будет записать, какой друг в отношениях сделал запрос, чтобы при изучении объекта вы могли сказать, какой пользователь может превратить запрос в подтвержденную дружбу.

0 голосов
/ 03 декабря 2009

На основании этой страницы: http://docs.djangoproject.com/en/dev/topics/db/queries/

Следующий код:

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

соответствует: to_friend = user OR confirmed = 3. Что, вероятно, не то, что вы хотите, основываясь на вашем описании.

Это выглядит ближе к тому, что вы хотите:

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