只有Profile的所有者能够更新数据



在Django rest框架中使用class Based (APIView)获取和更新UserInfo数据

views.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)

serializers.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的数据。

urls . 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 for Auth

models.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

如有任何帮助,不胜感激

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

对于检索和更新对象,您可以使用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来获取和更新用户,只需在点击api时更改postman中的方法。GET用于检索,PATCH用于部分更新。

path('userinfo/', views.GetUserInfo.as_view(), name="UserInfo"),

最新更新