Django比较用户列表

时间:2013-03-27 13:05:06

标签: django

我有一个类似的功能,允许学生喜欢其他图片。

  def LikePicture(request,picture_id):
      p = Picture.objects.get(pk=picture_id)
      new_like, created = Like.objects.get_or_create(user=request.user, picture_id=picture_id)
      return HttpResponseRedirect(reverse('world:Boat', kwargs={'animal_id': the_id }))

目前,我正试图对喜欢特定图片的人实施限制。 我只希望与特定用户成为朋友的人喜欢他们的照片和唯一的方式 我可以通过实现朋友模型来做到这一点。

2如果两个用户互相添加,则用户只能是朋友。

我打算使用这种友谊模式,除非有人有更好的友谊模型,我们都可以用它来实施限制。

  class Friendship(models.Model):
    from_friend = models.ForeignKey(User, related_name='friend_set')
    to_friend = models.ForeignKey(User, related_name='to_friend_set')
    def __unicode__(self):
      return u'%s, %s' % (
        self.from_friend.username,self.to_friend.username)
    class Meta:
      unique_together = (('to_friend', 'from_friend'), )

我们可以与

建立关系
  >>> user1 = User.objects.get(id=1)
  >>> user2 = User.objects.get(id=2)
  >>> friendship1 = Friendship(from_friend=user1, to_friend=user2)
  >>> friendship1.save()
  >>> user1.friend_set.all()
  [<Friendship: user1, user2>, <Friendship: user1, user3>]

但是为了成为朋友。其他用户必须添加其他用户。

  >>> friendship3 = Friendship(from_friend=user2, to_friend=user1)
  >>> friendship3.save()
  >>> user2.friend_set.all()
      [<Friendship: user2, user1>]

现在,问题是我们如何编辑类似的功能,这样才能让朋友喜欢图片。

我想到了一种方法,但我找不到将其实现到我喜欢的功能中的方法。我的想法是因为我们可以抓住拥有图片的用户对象以及想要了解图片的人。我们可以比较彼此的朋友列表。 我们获得拥有图片的用户对象,并获得试图喜欢图片的用户对象。然后我们比较拥有图片的用户是否有想要在他的朋友列表上喜欢他的图片的用户&gt;&gt;&gt; user1.friend_set.all() 我们反过来做如果用户所有者的图片在request.user friendlist中.Allow赞!!! 。

所以就好像,如果两个用户在同一个朋友列表中互相拥有。允许像!!!

这与此功能类似

  def Like(request,picture_id):
      user1 = User.objects.get(user=request.user) # The Guy who trying to like the picture
      p = Picture.objects.get(pk=picture_id)
      user2 = User.objects.get(picture=p) # The owner of the picture
      if user1 is in user2.friend_set.all() AND if user2 is in user1.friend_set.all():
           new_like, created = Like.objects.get_or_create(user=request.user, picture_id=picture_id)
      else:
           message ('You can only like if you are an friend ')
           return HttpResponseRedirect(reverse('world:Boat', kwargs={'animal_id': the_id }))

      return HttpResponseRedirect(reverse('world:Boat', kwargs={'animal_id': the_id }))

或者我们可以比较用户对象

>>> [friendship.to_friend for friendship in 
user1.friend_set.all()]
[<User: user2>, <User: user3>]

1 个答案:

答案 0 :(得分:1)

需要改进一点:

class FriendshipManager(models.Manager):
    def is_friends(self, user_a, user_b):
        if self.get_query_set().filter(
            user__id=user_a.id, friend__id=user_b.id, is_accepted=True).exists() or \
            self.get_query_set().filter(
                user__id=user_b.id, friend__id=user_a.id, is_accepted=True).exists():
            return True
        else:
            return False


class Friendship(models.Model):
    user = models.ForeignKey(User)
    friend = models.ForeignKey(User, related_name='friends')
    is_accepted = models.BooleanField(default=False)

    objects = FriendshipManager()

    def __unicode__(self):
        return u'%s, %s' % (
            self.user.username, self.friend.username)

    class Meta:
        unique_together = (('user', 'friend'), )


def Like(request, picture_id):
    user = request.user
    p = get_object_or_404(Picture, pk=picture_id)
    pic_owner = p.user # i hope you have user relationship with pic here
    if Friendship.objects.is_friends(user, pic_owner) \
        pic_owner.id == user.id:
        # if the pic owner and requested user are friends
        # or user is liking his own pic
        new_like, created = Like.objects.get_or_create(
            user=user, picture=p)
    else:
        message ('You can only like if you are friends')
        return HttpResponseRedirect(
            reverse('world:Boat', kwargs={'animal_id': the_id }))

    return HttpResponseRedirect(
        reverse('world:Boat', kwargs={'animal_id': the_id }))

添加了is_accepted字段以确保其他人批准了该朋友请求。 在管理器中添加了is_friends方法,用于检查两个用户是否为朋友。 在视图中还检查了请求的用户和图片所有者是否相同,那么这意味着用户可以喜欢自己发布的图片。此代码未经测试,但我希望这对您有用。