简体   繁体   English

Django:如何在视图集中获取当前用户 ID

[英]Django: How to get the current user id in viewsets

This is my view using rest_framwork viewsets.这是我使用 rest_framwork 视图集的视图。 I am a beginner at this please help.我是这方面的初学者,请帮忙。

These are my serializer classes.这些是我的序列化程序类。

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')

These are my viewset classes.这些是我的视图集类。

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, )

I didn't quite understand how to filter out based on the current user who is logged in.我不太明白如何根据当前登录的用户进行过滤。

You can get the current user from request.您可以从请求中获取当前用户。 Please keep in mind that you will get anonymous user if user is not authenticated and viewset permission is open for all.请记住,如果用户未通过身份验证并且视图集权限对所有人开放,您将获得匿名用户。 Also you can pass the request.user instance in get serializer context and use in serializers also.您也可以在获取序列化程序上下文中传递 request.user 实例并在序列化程序中使用。

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

override get_quesryset method and filter query using self.request.user使用 self.request.user 覆盖 get_quesryset 方法和过滤查询

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

Try this尝试这个

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM