显示每个 post django REST API 中的所有喜欢计数

show all likes count in each post django REST API

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"),
]

输出:

[
{
  "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

实际上在我的数据库中喜欢的是: post1个有2个赞 post 2 个有 1 个赞 post3个没有赞

我想这样展示。 但它显示每个 post 的第一个 post 赞。 我怎样才能解决这个问题 。? 我知道 like_count 中的问题。 但我不知道该放什么而不是 id 。

抱歉我的英语不好 提前致谢

你可以像这样制作你的序列化器:

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 会是

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

利用关系,很有帮助。在Post模型中定义一个函数,这样序列化器就可以很容易地得到它。

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)

人际关系如何运作:

我们将 related_name='likes' 添加到 PostLike.post 字段。该字段作为 ForeignKey 连接到它引用的 Post 对象。这意味着这是一种可以反向使用的快捷方式。它主要表现为经典的 QuerySet 但只有相关对象(在本例中 PostLikes 具有给定 Post 对象的对象。

让我们使用您上面的模型。使用示例:

post = Post.objects.first()   # now 'post' is the first Post object

post.likes                    # it's just a relationship object, not helpful for now
post.likes.all()              # that gives QuerySet of all PostLike objects, that has this instance of Post as ForeignKey.
post.likes.filter(user__id=1) # that gives filtered QuerySet of PostLike with this instance of Post and instance of User with id 1
post.likes.last()             # that gives related PostLike object with highest pk/id - depending on ordering of course
post.likes.all().count()      # that gives the total count of all related objects

看官方文档,很有收获。 https://docs.djangoproject.com/en/4.0/topics/db/models/#relationships