[Django]-Django Rest Framework – Displaying the User's Profile

3👍

Create a new serializer for Profile model

class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = "__all__"

then create a new view class for the Profile.

from rest_framework.views import APIView
from rest_framework.response import Response
from django.shortcuts import get_object_or_404


class ProfileAPI(APIView):
    def get(self, request, *args, **kwargs):
        user = get_object_or_404(User, pk=kwargs['user_id'])
        profile_serializer = ProfileSerializer(user.profile)
        return Response(profile_serializer.data)

Then, wire up the view in urls.py

urlpatterns = [
    # your other url configs
    path('api/users/<user_id>/profile/', ProfileAPI.as_view())
]

Update-1

Implementation using ViewSet class

from rest_framework import viewsets
from rest_framework.response import Response
from django.shortcuts import get_object_or_404


class ProfileAPI(viewsets.ViewSet):
    def get(self, request, *args, **kwargs):
        user = get_object_or_404(User, pk=kwargs['user_id'])
        profile_serializer = ProfileSerializer(user.profile)
        return Response(profile_serializer.data)

Update-2

from rest_framework import viewsets


class ProfileAPI(viewsets.ModelViewSet):
    serializer_class = ProfileSerializer

    def get_queryset(self):
        return Profile.objects.filter(user=self.kwargs['user_id'])

and in your urls.py register the viewset as

router.register('api/users/(?P<user_id>\d+)/profile', ProfileAPI, base_name='profile_api')
👤JPG

0👍

i have used **AbstractUser ** and **custom user manager **
i have used ViewSets.ViewSet along with Model Serializers

#urls.py file#

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import ProfileViewSet, LoginViewSet, RegisterViewSet

router = DefaultRouter()
router.register(r'register', RegisterViewSet, basename='register')
router.register(r'login', LoginViewSet, basename='login')
router.register(r'profile', ProfileViewSet, basename='profile')

urlpatterns = [
path('', include(router.urls)),
]

#views.py file#

from rest_framework.response import Response
from rest_framework.viewsets import ViewSet
from .models import user_reg
from .serializers import RegisterSerializer


class ProfileViewSet(ViewSet):

    def partial_update(self, request, pk=None):    #partially update the profile

        try:
            user_detail = user_reg.objects.get(pk=pk)
           
            serializer = RegisterSerializer(user_detail,data=request.data, partial=True)

            if not serializer.is_valid():
                return Response({'data':'internal server error','message':'error aa gyi'},500)

            serializer.save()

        except Exception as e:

            return Response('some exception occured' + str(e))

        return Response('record Updated successfully')

    def retrieve(self,request, pk=None):    #get or retrieve the profile from database

        queryset = user_reg.objects.get(pk=pk)
    
        serializer_class = RegisterSerializer(queryset)
    
        return Response(serializer_class.data)

#serializer.py file#

from rest_framework import serializers
from .models import user_reg

class RegisterSerializer(serializers.ModelSerializer):

    class Meta:
        model = user_reg
        fields = ('username','first_name','last_name','email')  #custom fields i made 
                                                                 u can change this

#models.py#

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import UserManager



class user_reg(AbstractUser):
    mobile = models.CharField(max_length=10, blank=True, null=True)
    age = models.IntegerField(null=True,blank=False)
    gender = models.CharField(max_length= 8,blank=True)
    objects = UserManager()

    class Meta:
        verbose_name='user'

Leave a comment