友谊关系问题

时间:2009-12-02 22:06:28

标签: python django models

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

  1. user1添加了一个名为user2的朋友
  2. user2确认user1是他的朋友
  3. 应该发生的事情是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,
            })
    

2 个答案:

答案 0 :(得分:1)

你的友谊模型是联想的并不明显。我的朋友列出了我from_user所有友谊的列表吗?或者是我所有的友谊,我是from_user还是to_user

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

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

答案 1 :(得分:0)

根据此页面: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)
)