Home > Enterprise >  show all likes count in each post django REST API
show all likes count in each post django REST API

Time:02-02

models.py

class Post(models.Model):
   title = models.CharField(max_length=150)

class PostLike(models.Model):
    like = models.CharField(max_length=20)
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

Serializer.py

class PostSerializer(serializers.ModelSerializer):
    likes = serializers.SerializerMethodField("like_count")
    class Meta:
        model = Post
        fields  = ("__all__")

    def like_count(self,obj):
        total_like = self.context.get("like_count")
        return total_like

views.py

@api_view(["POST"])
def allpost(request):
    id = request.data    
    post_list = Post.objects.all()
    like_count = PostLike.objects.filter(post_id = id ).count()
    post_serializer = PostSerializer(post_list,many=True,context={"like_count":like_count})
    return Response(request,post_serializer.data)

urls.py

urlpatterns = [
 path('post/',views.allpost,name="post"),
]

output:

[
{
  "id": 1,
  "likes": 1,
  "title": "post 1",
},
{
  "id": 2,
  "likes": 1,
  "title": "post 2",
},
{
  "id": 3,
  "likes": 1,
  "title": "post 3",
},
]

db

id like post_id user_id
1   1     1      1
2   1     2      1
3   1     1      2

actually in my db likes are: post 1 have 2 likes post 2 have 1 like post 3 don't have any like

i want to show this like this . but it's showing the first post likes for every post . how can i fix this .? i know the problem in the like_count in view . but i don't know what to put there instead of id .

sorry for my poor English Thanks in advance

CodePudding user response:

Use relationships, it helps a lot. Define a function in Post model, so serializer can get it easily.

models.py:

class Post(models.Model):
   title = models.CharField(max_length=150)

   def likes_count(self):
       return self.likes.all().count()

class PostLike(models.Model):
    like = models.CharField(max_length=20)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_likes')
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='likes')

serializers.py:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields  = ["id", "title", "likes_count"]

    # That part you can delete
    # def like_count(self,obj):
    #     total_like = self.context.get("like_count")
    #     return total_like

views.py:

@api_view(["POST"])
def allpost(request):
    post_list = Post.objects.all()
    post_serializer = PostSerializer(post_list, many=True)
    return Response(request, post_serializer.data)

CodePudding user response:

You can make your serializer like this:

class PostSerializer(serializers.ModelSerializer):
    likes = serializers.SerializerMethodField()
    class Meta:
        model = Post
        fields  = ("__all__")

    def like_count(self, obj):
        total_like = PostLike.objects.filter(post__id=obj.id).count()
        return total_like

views.py would be

@api_view(["POST"])
def allpost(request):
    post_list = Post.objects.all()
    post_serializer = PostSerializer(post_list, many=True)
    return Response(request, post_serializer.data)
  •  Tags:  
  • Related