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

さて、問題は、友達だけが写真を好きになるように、like関数をどのように編集できるかということです。

私は方法を考えましたが、それを私のような関数に実装する方法を見つけることができませんでした。私の考えは、写真を所有しているUserオブジェクトと、写真を好きにしようとしている人をつかむことができるからです。お互いのフレンドリストを比較できます。写真を所有しているユーザーオブジェクトを取得し、写真を高く評価しようとしているユーザーオブジェクトを取得します。次に、写真を所有しているユーザーが、フレンドリストで自分の写真を高く評価しようとしているユーザーを持っているかどうかを比較します>>> user1.friend_set .all()とは逆に行います。ユーザー所有者の写真がrequest.userフレンドリスト内にある場合。。

つまり、両方のユーザーが同じフレンドリストにお互いを持っている場合のようになります。のように許可します!!!

この関数に似たものになります

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

または、Usersオブジェクトを比較できます

>>> [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_friends2人のユーザーが友達かどうかを確認するために使用されるマネージャーのメソッドを追加しました。ビューでは、要求されたユーザーと画像の所有者が同じであるかどうかもチェックされ、ユーザーが自分の投稿された画像を高く評価できることを意味します。このコードはテストされていませんが、これがお役に立てば幸いです。

于 2013-03-27T14:00:14.143 に答える