2013-03-27 3 views
1

У меня есть функция, которая позволяет студентам любить на других фотографиях.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'),) 

Мы можем Bulid отношения с

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

Теперь Проблема заключается в том, как мы можем изменить как функцию, так это только позволяет друзьям нравится картину.

Я подумал об этом, но не смог найти способ реализовать его в своей функции. Моя идея состоит в том, что мы можем захватить объект User, которому принадлежит картина, и парень, который пытается понравиться картинке. Мы можем сравнить друг друга. Мы получаем объект пользователя, которому принадлежит изображение, и мы получаем объект пользователя, который пытается понравиться картинке. Затем сравним, если пользователь, у которого есть фотография, имеет пользователя, который пытается любить свою фотографию в своем списке друзей >>> user1. friend_set.all() , и мы делаем это в обратном порядке. Если изображение пользователя пользователя находится в списке друзей request.user .Allow 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>] 
+0

Надеюсь, этот вопрос имеет смысл, если только я не отредактирую его: D – donkeyboy72

ответ

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 метод в менеджере, который будет использоваться, чтобы проверить, являются ли два пользователя друзьями. . Также можно проверить, если пользователь и владелец изображения совпадают, тогда это означает, что пользователю может понравиться его собственное опубликованное изображение. Этот код не проверен, но я надеюсь, что это послужит вам хорошо.

+0

@ donkeyboy72 (смешное название) Нет проблем :) Если это поможет, вы можете отметить ответ как принятый. –

+0

Да, конечно, я обязательно отвечу, если я arround –

+0

Большое спасибо Aamir. – donkeyboy72

Смежные вопросы