Как правильно работать с лайками в Django?

Ребят, всем привет.

Задача:

В каждой статье в каждом комментарии есть лайки (палец вверх, палец вниз). Задача сделать так, чтобы каждый пользователь мог поставить всего один лайк за статью или за комментарий.

Варианты реализации:

1) вешать куку/сессию, которая будет выключать панельку лайков для юзера, который на неё уже нажимал.

2) Делать Forenkey для каждого объекта и записывать туда username тех, кто поставил лайк. И уже проводить проверку через базу.

Второй вариант выглядит надежней, но есть вопрос по реализации.
  • Вопрос задан
  • 2641 просмотр
Решения вопроса 1
@deliro
1) Если лайки ставятся без авторизации - это уже ненадёжно. Нет способа отсделить юзера, если он почистит куки/сменит браузер/зайдёт с другого айпишника (очень актуально сейчас, в век мобильного инета).

2) С авторизацией: на объект, которому ставят лайки вешай M2M к юзеру.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Terras
@Terras Автор вопроса
Вот так вышло:

Модель видео

class Video(models.Model):    
    thumbnumber = models.IntegerField(default=0, help_text="Начинается с 0", verbose_name="Число лайков")
    likedone = models.ManyToManyField(User, related_name='users_video_main')


Вьюшка добавления лайка:

def upvideolike(request, add_id):

    if request.user.is_authenticated():
        video_item = Video.objects.get(id = add_id)
        user_tags = User.objects.filter(users_video_main = add_id)
        current_user = request.user
        if current_user not in user_tags:
            try:
                video_item = Video.objects.get(id = add_id)
                video_item.thumbnumber +=1
                video_item.likedone.add(current_user)
                video_item.save()
                return redirect('/video'+ add_id)
            except ObjectDoesNotExist:
                return redirect('/video'+ add_id)
        else:
            return redirect('/video'+ add_id)
    else:
        return redirect('/video'+ add_id)


Пока сделал так, потом буду переделывать, чтобы обрабатывалось в режиме реального времени.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы