Search code examples
pythondjangomany-to-many

Cannot use add() on a ManyToManyField which specifies an intermediary model. Use .LikeTimestamp's Manager instead


I'm trying to make a good like in my blog. Got problem, do not know how to use Manager here. Guess this is my main mistake. Cannot use add() on a ManyToManyField which specifies an intermediary model. Use Posts.LikeTimestamp's Manager instead.

my models:

class Like(models.Model):
    class Meta:
        db_table = 'like'
    post = models.OneToOneField(Post, null=True)
    liked_users = models.ManyToManyField(User, blank=True, through='LikeTimestamp')
    likes = models.IntegerField(default=0, blank=True)


class LikeTimestamp(models.Model):
    class Meta:
        db_table = 'liketimestamp'
    timestamp = models.DateTimeField(auto_now=True, auto_now_add=False)
    like = models.ForeignKey(Like)
    user = models.ForeignKey(User)

my views:

@login_required
def like_post(request, comments_id):
    try:
        like, created = Like.objects.get_or_create(comments_id=comments_id)
        like.post = Post.objects.get(id=comments_id)
        if request.user in like.liked_users.all():
            like.liked_users.remove(request.user)
            like.likes -= 1
        else:
            like.liked_users.add(request.user)
            like.likes += 1
        like.save()
    except ObjectDoesNotExist:
        raise Http404
    return redirect(request.META.get('HTTP_REFERER'))

Solution

  • My friend advised my to user filter and mistake gone. And also there was a wrong line about liked_users create. I should use creation and deleting through timestamp model. Here is right code.

    @login_required
    def like_post(request, post_id):
        try:
            like, created = Like.objects.get_or_create(post_id=post_id)
            like.post = Post.objects.get(id=post_id)
            if like.liketimestamp_set.filter(user=request.user).exists():
                LikeTimestamp.objects.filter(like_id=like.id, user=request.user).delete()
                like.likes -= 1
            else:
                LikeTimestamp.objects.create(like_id=like.id, user=request.user)
                like.likes += 1
            like.save()
        except ObjectDoesNotExist:
            raise Http404
        return redirect(request.META.get('HTTP_REFERER'))