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