django 只有配置文件的所有者才能更新数据

mfpqipee  于 2022-11-26  发布在  Go
关注(0)|答案(2)|浏览(147)

在Django rest框架中使用基于类(APIView)来获取和修补(更新)UserInfo数据。

查看次数.py

class getUserInfo(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request, format=None):
        user = request.user
        userinfos = user.userinfo_set.all()
        serializer = UserInfoSerializers(userinfos, many=True)
        return Response(serializer.data)

    def patch(self, request, pk, format=None):
        user = UserInfo.objects.get(id=pk)
        serializer = UserInfoSerializers(instance=user, data=request.data, partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

序列化程序.py

from django.contrib.auth.models import User
from .models import UserInfo

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'first_name', 'username')

class UserInfoSerializers(serializers.ModelSerializer):
    user = UserSerializer(many=False, required=True)

    class Meta:
        model = UserInfo
        fields = ('id', 'picture', 'profession', 'user')

目前为止一切正常。能够获取和修补(更新)已登录的用户数据。在Postman中测试API时,我发现如果User1已登录,他可以只使用User2的pk来更改User2的数据。

网址.py

urlpatterns = [
    path('userinfo/', views.getUserInfo.as_view(), name="UserInfo"),
    path('userinfo/<str:pk>/', views.getUserInfo.as_view()),
    path('api/token/', views.MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('register/', views.RegisterView.as_view(), name='auth_register'),
]
  • 使用rest_framework_simplejwt进行身份验证 *
    模型.py
from django.contrib.auth.models import User

class UserInfo(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    picture = models.ImageField(upload_to="profile_pics", null=True)
    profession = models.CharField(max_length=200, null=True)

    def __str__(self):
        return "%s's Profile Picture" % self.user

任何帮助都将不胜感激

htrmnn0y

htrmnn0y1#

不要使用主键来获取用户。您正在使用user = request.userget方法上获取用户,在update上也使用相同的机制。这样登录用户就只能更新他/她的信息而不能更新其他信息,或者您可以用另一种方法来检查user = UserInfo.objects.get(id=pk)是否与当前用户request.user相同。如果不相同,您可以显示一个异常。

jchrr9hc

jchrr9hc2#

对于检索和更新对象,可以使用RetrieveUpdateAPIView

class GetUserInfo(generics.RetrieveUpdateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = UserInfo.objects.all()
    serializer_class = UserInfoSerializers
    
    def get_object(self):
        return self.request.user

这里我们得到了一个对象,它将从get_object方法调用。我们不是用PK得到用户,而是得到当前用户。
您可以使用相同的url来获取和更新用户,只需在postman中更改方法,同时单击api.GET进行检索,单击PATCH进行部分更新。
path('userinfo/', views.GetUserInfo.as_view(), name="UserInfo"),

相关问题