1

我有一个点赞功能,可以让学生在其他图片中点赞。

  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>]

现在,问题是我们如何编辑点赞功能,让它只允许朋友点赞一张图片。

我已经想到了一种方法,但我找不到将它实现到我的类似功能中的方法。我的想法是因为我们可以获取拥有图片的用户对象和想要喜欢图片的人。我们可以互相比较friendlist。我们得到拥有该图片的用户对象,我们得到试图喜欢该图片的用户对象。然后我们比较拥有该图片的用户在他的好友列表中是否有试图喜欢他的图片的用户>>> user1.friend_set .all() 我们反过来做。如果用户所有者的图片在 request.user 好友列表中。允许 Like!!! .

所以这就像,如果两个用户在同一个好友列表中都有对方。允许喜欢!!!

这将类似于此功能

  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>]
4

1 回答 1

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了用于检查两个用户是否为好友的方法。在视图中还检查了请求的用户和图片所有者是否相同,这意味着用户可以喜欢自己发布的图片。这段代码未经测试,但我希望它能很好地为您服务。

于 2013-03-27T14:00:14.143 回答