DRF中如何获取URL传入的用户ID及当前登录用户ID?
问题
我使用UserPostSerializer获取非当前登录用户的帖子详情时,需要判断当前登录用户是否收藏了该帖子。但目前self.context['request'].user返回的是帖子作者而非登录用户,且URL中传入了用户ID,想知道如何获取当前登录用户ID或URL中的用户ID。
相关代码
序列化器代码
class UserPostSerializer(serializers.ModelSerializer): images = PostImageSerializer(many=True, read_only=True, required=False) profile = serializers.SerializerMethodField() bookmarked = serializers.SerializerMethodField() class Meta: model = Post fields = [ "id", "category", "body", "images", "video", "profile", "published", "bookmarked", "created_at", "updated_at", ] depth=1 def get_profile(self, obj): profile_obj = Profile.objects.get(id=obj.user.profile.id) profile = ShortProfileSerializer(profile_obj) return profile.data def get_bookmarked(self, obj): breakpoint() bookmark = Bookmark.objects.filter(owner=obj.user.id, post=obj.id,marktype='post') if bookmark: return True else: return False
Bookmark模型代码
class Bookmark(models.Model): marktype = models.CharField(max_length=50) post = models.OneToOneField(Post, on_delete=models.CASCADE, null=True, blank=True) owner = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True, verbose_name="created at") updated_at = models.DateTimeField(auto_now=True, verbose_name="updated at") class Meta: verbose_name = "bookmark" verbose_name_plural = "bookmarks" ordering = ["created_at"] db_table = "bookmarks" def __str__(self): return "{}'s bookmark".format(self.owner.username)
URL配置
path("posts/<int:user>/home/", HomeView.as_view(), name="home"),
解决方法
1. 确保request.user指向当前登录用户
检查视图类HomeView的权限认证配置,确保request.user正确返回当前登录用户:
from rest_framework.views import APIView from rest_framework.permissions import IsAuthenticated from rest_framework.authentication import SessionAuthentication, TokenAuthentication class HomeView(APIView): # 配置认证方式 authentication_classes = [SessionAuthentication, TokenAuthentication] # 要求用户必须登录才能访问 permission_classes = [IsAuthenticated] def get(self, request, user): # 逻辑代码 target_user = User.objects.get(id=user) posts = Post.objects.filter(user=target_user) # 务必将request传入序列化器的context serializer = UserPostSerializer(posts, many=True, context={'request': request}) return Response(serializer.data)
2. 获取URL中的用户ID
在序列化器内,通过request的路由解析参数获取URL中的用户ID:
# 在序列化器的任意方法中使用 url_user_id = self.context['request'].resolver_match.kwargs.get('user')
3. 修正收藏状态判断逻辑
原get_bookmarked方法错误使用了帖子作者ID作为收藏者,改为当前登录用户判断:
def get_bookmarked(self, obj): current_user = self.context['request'].user # 使用exists()更高效,无需返回完整查询集 return Bookmark.objects.filter(owner=current_user, post=obj, marktype='post').exists()
4. 修正Bookmark模型的关联字段(可选)
当前post字段是OneToOneField,意味着一个帖子只能被一个用户收藏,不符合常规需求,建议改为ForeignKey:
post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True, blank=True)
内容的提问来源于stack exchange,提问作者crawlingdev
相关产品推荐
相关产品推荐

