【问题标题】:A Friendship relationship question友谊关系问题
【发布时间】:2010-12-22 14:41:45
【问题描述】:

我在列出此类数据时遇到了困难。情景是 如下:

  1. user1 添加了一个叫 user2 的朋友
  2. user2 确认 user1 是他的朋友

应该发生的是 user2 和 user1 在他们的 朋友名单。现在发生的事情是我能够将 user2 添加到 user1 朋友列表,但 user1 在他/她的列表中看不到 user2。我的问题 是如何让 user1 出现在 user2 的列表中和 user2 出现 如果用户已确认友谊,在 user1 的朋友列表中?我曾是 考虑利用模型中的确认状态,因为 user1 和 user2 的 id 都在已确认的关系中 在这里看不到任何完整性问题。有什么建议吗?

友谊模型:

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

【问题讨论】:

    标签: python django models


    【解决方案1】:

    您的友谊模型是否具有关联性并不明显。我的朋友是否列出了我是 from_user 的所有友谊的列表?还是我是from_userto_user 的所有友谊?

    如果是前者,那么每个朋友关系都由两个友谊对象表示,一个表示你是我的朋友,一个表示我是你的朋友。每当用户提出请求时,您都会添加两个好友。状态将指示提出请求的人是from_user 还是to_user。当请求被确认或拒绝时,您将更新两个好友关系以反映这一点。

    如果是后者,那么每个朋友关系都由一个友谊对象表示。在这种情况下,您的对象设计将需要记录关系中的哪个朋友提出了请求,这样当您检查对象时,您就可以知道哪个用户可以将请求转化为已确认的友谊。

    【讨论】:

      【解决方案2】:

      基于此页面: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)
      )
      

      【讨论】:

        猜你喜欢
        • 2012-10-28
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 2016-09-27
        • 2011-12-01
        • 1970-01-01
        相关资源
        最近更新 更多