Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django rest framework RetrieveUpdateAPIView

I come from Vietnam.

I want to update User by Django Rest FrameWork. I can update User by 'pk'. But I can't update User by 'username'. I hope that everyone help me. Thank you so much.

serializers.py

class UserDetailSerializer(serializers.ModelSerializer):
    url_update = serializers.HyperlinkedIdentityField(view_name='api:UserUpdateAPIView', lookup_field='username')
    class Meta:
        model = User
        fields = ('url_update', 'username', 'email', 'user_permissions', 'is_staff', 'groups', 'last_login')

class UserUpdateSerialier(serializers.ModelSerializer):
    password = serializers.CharField(
        style={'input_type': 'password'}
    )
    class Meta:
        model = User
        fields = ('pk', 'username', 'password')

    def update(self, instance, validated_data):
        instance.username = validated_data.get('username', instance.username)
        instance.set_password(validated_data.get('password', instance.password))
        instance.save()
        return instance

views.py

class UserDetailAPIView(generics.RetrieveAPIView):
    permission_classes = (permissions.IsAdminUser,)
    serializer_class = UserDetailSerializer
    #queryset = User.objects.all()
    lookup_field = 'username'
    def get_object(self):
        username = self.kwargs["username"]
        return get_object_or_404(User, username=username)

class UserUpdateAPIView(generics.RetrieveUpdateAPIView):
    permission_classes = (permissions.IsAdminUser,)
    #queryset = User.objects.all()
    serializer_class = UserUpdateSerialier

    def get_object(self):
        username = self.kwargs["username"]
        return get_object_or_404(User, username=username)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

urls.py

url(r'^$', views.UserListAPIView.as_view(), name='UserListAPIView'),
url(r'^(?P<username>.*)/$', views.UserDetailAPIView.as_view(), name='UserDetailAPIView'),
url(r'^(?P<username>.*)/update/$', views.UserUpdateAPIView.as_view(), name='UserUpdateAPIView'),

HTTP 404 Not Found

Allow: GET, HEAD, OPTIONS

Content-Type: application/json

Vary: Accept

{ "detail": "Not found." }

like image 275
Luan Avatar asked Jul 10 '26 06:07

Luan


2 Answers

Try editing your view like this,

class UserUpdateAPIView(generics.RetrieveUpdateAPIView):
    permission_classes = (permissions.IsAdminUser,)
    serializer_class = UserUpdateSerialier
    lookup_field = 'username'

    def get_object(self):
        username = self.kwargs["username"]
        return get_object_or_404(User, username=username)

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)
like image 87
zaidfazil Avatar answered Jul 11 '26 20:07

zaidfazil


You need to set lookup_field = 'username' to the UserUpdateAPIView just like you did with the UserDetailAPIView

like image 43
Linovia Avatar answered Jul 11 '26 20:07

Linovia



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!