Django Rest Framework:如何检查登录用户是否已点赞帖子?
问题:判断登录用户是否已点赞某篇帖子
我有Post模型和对应的点赞模型PostResponse,需要判断登录用户是否已经点赞了某篇帖子,也就是验证登录用户ID是否匹配该帖子的任意点赞用户ID。
Post模型代码
class Post(models.Model): category = models.ForeignKey(Category, on_delete=models.SET_DEFAULT, default=1, related_name="posts") body = models.TextField("content", blank=True, null=True, max_length=5000) slug = AutoSlugField(populate_from=["category", "created_at"]) video = models.FileField(upload_to=video_directory_path, null=True, blank=True) user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="posts" ) published = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: verbose_name = "post" verbose_name_plural = "posts" db_table = "posts" ordering = ["created_at"] get_latest_by = "created_at" def __str__(self): return self.body[0:30] def get_absolute_url(self): return self.slug def one_image(self): return PostImage.objects.all().filter(post=self)[:1]
PostResponse(点赞)模型代码
class PostResponse(models.Model): like = "like" feelings = [ (like , "like"), ] response = models.CharField(max_length=15,choices=feelings, default=like) post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="responses") user = models.ForeignKey(User, on_delete=models.CASCADE) class Meta: unique_together = ['post', 'user'] verbose_name = "Post response" verbose_name_plural = "Post responses" db_table = "post_responses" def __str__(self): return str(self.response)
现有序列化器的问题
现有PostResponse序列化器只能处理单个点赞记录,无法检查当前登录用户是否给对应帖子点过赞,代码如下:
class PostResponseSerializer(serializers.ModelSerializer): liked = serializers.SerializerMethodField() class Meta: model = PostResponse fields = [ "post", "response", "user", "liked", ] def get_liked(self, obj): request = self.context.get('request', None) if request: loggedUser = self.context["request"].user.id if loggedUser == obj.user.id: return True
修改方案
方案一:在Post序列化器中添加判断(推荐)
实际场景中,我们通常需要在帖子的序列化数据里附带“当前用户是否点赞”的状态,所以更合理的做法是在Post的序列化器中实现:
class PostSerializer(serializers.ModelSerializer): liked = serializers.SerializerMethodField() # 按需添加其他需要序列化的字段 class Meta: model = Post fields = ["id", "body", "user", "liked", "created_at"] # 自行补充所需字段 def get_liked(self, obj): request = self.context.get('request') # 未登录用户直接返回False if not request or not request.user.is_authenticated: return False # 查询当前用户是否给该帖子点过赞,exists()效率更高 return PostResponse.objects.filter(post=obj, user=request.user).exists()
使用时要确保给序列化器传递request上下文:
# 视图示例 serializer = PostSerializer(posts, many=True, context={'request': request})
方案二:修改PostResponseSerializer
如果确实需要在单个点赞记录的序列化数据里判断当前用户是否给该帖子点过赞,修改get_liked方法即可:
class PostResponseSerializer(serializers.ModelSerializer): liked = serializers.SerializerMethodField() class Meta: model = PostResponse fields = ["post", "response", "user", "liked"] def get_liked(self, obj): request = self.context.get('request') if not request or not request.user.is_authenticated: return False # 检查当前用户是否给该帖子有过点赞记录 return PostResponse.objects.filter(post=obj.post, user=request.user).exists()
内容的提问来源于stack exchange,提问作者crawlingdev
相关产品推荐
相关产品推荐

