Django REST: creating CRUD operations for OneToOne field

I am trying to create basic CRUD operations for the OneToOne field. The user is not required to set a profile at the login. How can I create / update / delete a profile if necessary (if the user is already in the database)?

My models are the default user models from Django REST and:

class UserProfile(models.Model):
        user = models.OneToOneField(User)
        location = models.CharField(max_length=50,blank=True)
        title = models.CharField(max_length=80,blank=True)
        #picture = models.ImageField(upload_to='user_imgs', blank=True)
        website = models.URLField(blank=True)

My views:

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_fields = ['id', 'username', 'email', 'first_name', 'last_name']

class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    filter_fields = ['user_id', 'location', 'title', 'website']

And serialized:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        email = serializers.EmailField()
        fields = ('id','username', 'email', 'first_name', 'last_name')


class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
    user_id = serializers.CharField(source='user.id')

    class Meta:
        model = UserProfile
        fields = ('user_id', 'location','title','website')
+4
source share
2 answers

, . , , .

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_fields = ['id', 'username', 'email', 'first_name', 'last_name']


class UserProfileViewSet(viewsets.ModelViewSet):
    queryset = UserProfile.objects.all()
    serializer_class = UserProfileSerializer
    filter_fields = ['user_id', 'location', 'title', 'website']

    def get_queryset(self):
        return super(UserProfileViewSet, self).get_queryset().filter(
            user=self.request.user)

    def perform_create(self, serializer):
        serializer.save(user=user)

user perform_create .

class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = UserProfile
        fields = ('user', 'location','title','website')
        read_only_fields = ('user',)
+2

, view, , model serializer .

CRUD User :

lu = LibraryUser (library_membership_number = '...', user_id = )

class ExampleAPIView(APIView):
    def get(self, request):
        username = request.query_params.get('username', '')
        user = User.objects.get(username=username)
        return Response(ExampleSerializer(user).data)

    def post(self, request):
        username = request.data.get('username', '')
        email = request.data.get('email', '')
        password = request.data.get('password', '')
        user = User.objects.create_user(username=username, email=email, password=password)
        user.save()
        Response({'status': 'ok'}})

    def put(self, request):
        username = request.data.get('username', '')
        old_password = request.data.get('old_password', '')
        new_password = request.data.get('new_password', '')
        user = authenticate(username=username, password=old_password)
        if not user:
            return Response({'status': 'fail'}})
        user.set_password(new_password)
        return Response({'status': 'ok'}})

    def delete(self, request):
        username = request.query_params.get('username', '')
        user.objects.get(username=username).delete()
        return Response({'status': 'ok'}})

, :

  • GET:

  • POST:

  • PUT:

  • DELETE:

, Basic CRUD api User.

, api.


, model, :

class ExampleAPIView(APIView):
    def get(self, request):
        username = request.query_params.get('username', '')
        userprofile = UserProfile.objects.get(user__username=username)
        return Response(ExampleSerializer(userprofile).data)

    def put(self, request):
        username = request.data.get('username', '')
        userprofile = UserProfile.objects.get(user__username=username)
        if not userprofile :
            return Response({'status': 'fail'}})
        userprofile.location = ...
        userprofile.title = ...
        userprofile.website = ...
        userprofile.save()
        return Response({'status': 'ok'}})
+3

Source: https://habr.com/ru/post/1611051/


All Articles