You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:40:31