显示每个 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
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