Home:ALL Converter>Extending a user in django rest framework

Extending a user in django rest framework

Ask Time:2016-01-04T20:20:29         Author:kunal

Json Formatter

I am trying to extend a User class and write a serializer for it using django rest framework, I am trying to add mobileNumber field to User. Following is the code I am using:

models.py

from django.db import models

# Create your models here.
    from django.contrib.auth.models import User

class ValidateMeUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    mobileNumber = models.BigIntegerField(blank=True, null=True)

serializers.py

from django.contrib.auth.models import User
from rest_framework import viewsets
from rest_framework import serializers
from phone.models import ValidateMeUser

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'email','password')
    extra_kwargs = {'password': {'write_only': True}, }

    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user


class ValidateMeUserSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = ValidateMeUser
        fields = ('mobileNumber','user')

    def create(self, validated_data):
        user_data = validated_data.pop('user')
        user = User.objects.create_user(**user_data)
        validateMeUser = ValidateMeUser.objects.create(user=user, **validated_data)
        return validateMeUser

views.py

from django.shortcuts import render

# Create your views here.

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from phone.serializers import ValidateMeUserSerializer
from phone.models import ValidateMeUser

@api_view(['GET', 'POST'])
def user_list(request):
    """
    List all snippets, or create a new snippet.
    """
    if request.method == 'GET':
        users = ValidateMeUser.objects.all()
        serializer = ValidateMeUserSerializer(users, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = ValidateMeUserSerializer(data=request.data)
        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)

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from phone import views

urlpatterns = [
    url(r'^list/$', views.user_list),
    url(r'^admin/', include(admin.site.urls)),
]

When I run the curl command I get following message:

curl --data "username=user123455&password=sdasd&mobileNumber=2618221" http://127.0.0.1:8000/list/

{"user":{"username":["This field is required."],"password":["This field is required."]}}

It seems to me that the UserSerializer is either not getting called or not getting initialized properly. Can anyone help me out what might be causing this issue. Thanks in advance.

Author:kunal,eproduced under the CC 4.0 BY-SA copyright license with a link to the original source and this disclaimer.
Link to original article:https://stackoverflow.com/questions/34591038/extending-a-user-in-django-rest-framework
yy