【问题标题】:Django: How to get the current user id in viewsetsDjango:如何在视图集中获取当前用户 ID
【发布时间】:2020-12-05 16:37:39
【问题描述】:

这是我使用 rest_framwork 视图集的视图。我是这方面的初学者,请帮助。

这些是我的序列化程序类。

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
from . import models

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'password')
        extra_kwargs = {'password': {'write_only': True, 'required': True}}
    
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        Token.objects.create(user=user)
        return user

class ToDoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.ToDo
        fields = ('id', 'user', 'title', 'date')

这些是我的视图集类。

from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework import viewsets
from . import serializers, models
from rest_framework.authentication import TokenAuthentication

# Create your views here.

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = serializers.UserSerializer
    permission_classes = (AllowAny, )

class ToDoViewSet(viewsets.ModelViewSet):
    queryset = models.ToDo.objects.all()
    serializer_class = serializers.ToDoSerializer
    authentication_classes = (TokenAuthentication, )
    permission_classes = (IsAuthenticated, )

我不太明白如何根据当前登录的用户进行过滤。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    试试这个

    class UserViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
        serializer_class = serializers.UserSerializer
        permission_classes = (AllowAny, )
    
        def get_queryset(self):                                            # added string
            return super().get_queryset().filter(id=self.request.user.id)   # added string
    
    
    class ToDoViewSet(viewsets.ModelViewSet):
        queryset = models.ToDo.objects.all()
        serializer_class = serializers.ToDoSerializer
        authentication_classes = (TokenAuthentication, )
        permission_classes = (IsAuthenticated, )
    
        def get_queryset(self):                                            # added string
            return super().get_queryset().filter(user=self.request.user)   # added string
    

    【讨论】:

    • 非常感谢!!它确实有效!
    • 您可以验证我的答案作为解决方案
    【解决方案2】:

    您可以从请求中获取当前用户。 请记住,如果用户未通过身份验证并且视图集权限对所有人开放,您将获得匿名用户。 您也可以在获取序列化程序上下文中传递 request.user 实例并在序列化程序中使用。

    而不是 queryset = models.ToDo.objects.filter(user=1)

    覆盖 get_quesryset 方法并使用 self.request.user 过滤查询

    def get_queryset(self): 
        return models.ToDo.objects.filter(user=self.request.user)
    

    【讨论】:

    • 我不太明白。请帮忙。
    • 需要重写viewset的get_queryset方法
    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2014-06-20
    • 2015-06-01
    • 2023-03-24
    • 2013-01-03
    相关资源
    最近更新 更多