Creating custom user model using AbstractUser in django_Restframework - GeeksforGeeks

29 Nov, 2021
Every new Django project should use a custom user model. The official Django documentation says it is “highly recommended” but I’ll go a step further and say without hesitation: You are straight up crazy not to use a custom user model up front.
When you start your project with a custom user model, stop to consider if this is the right choice for your project.
Keeping all user related information in one model removes the need for additional or more complex database queries to retrieve related models. On the other hand, it may be more suitable to store app-specific user information in a model that has a relation with your custom user model. That allows each app to specify its own user data requirements without potentially conflicting or breaking assumptions by other apps. It also means that you would keep your user model as simple as possible, focused on authentication, and following the minimum requirements Django expects custom user models to meet.
So i think its clear why we need a custom user model in django, here in this article we are going to learn how to create custom user model and its api in django now
Create and navigate into a dedicated directory called users for our code
$ cd ~/Desktop$ mkdir code && cd code
Install Django 
$ pipenv install django
Make a new Django project called login
$ django-admin startproject login
Make a new app API and install rest framework 
$ python manage.py startapp api
$ pipenv install rest_framework
Now we need to configure our settings. py as follow
Python3
INSTALLED_APPS = [  'django.contrib.admin',  'django.contrib.auth',  'django.contrib.contenttypes',  'django.contrib.sessions',  'django.contrib.messages',  'django.contrib.staticfiles',  # Add these lines to to your installed apps section in settings. py  'rest_framework',  'rest_framework.authtoken',    'api',  'rest_auth'] AUTH_USER_MODEL ='api.urls'REST_FRAMEWORK = {  'DEFAULT_PERMISSION_CLASSES': (      'rest_framework.permissions.IsAuthenticated',  ),  'DEFAULT_AUTHENTICATION_CLASSES': (      'rest_framework_jwt.authentication.JSONWebTokenAuthentication',      'rest_framework.authentication.SessionAuthentication',      'rest_framework.authentication.BasicAuthentication',  ),}
After this we need to create a custom user model. For this change your models.py file. Here we are extending AbstractUser and changing authentication credentials to Email and we are also adding some extra fields in our custom user
Python3
from django.db import modelsfrom django.contrib.auth.models import AbstractUserfrom django.utils.translation import ugettext_lazy as _from django.conf import settingsfrom datetime import dateclass User(AbstractUser):  username = models.CharField(max_length = 50, blank = True, null = True, unique = True)  email = models.EmailField(_('email address'), unique = True)  native_name = models.CharField(max_length = 5)  phone_no = models.CharField(max_length = 10)  USERNAME_FIELD = 'email'  REQUIRED_FIELDS = ['username', 'first_name', 'last_name']  def __str__(self):      return "{}".format(self.email)
After this we need to save these changes to the admin panel as well. Add this code to the admin.py 
Python3
from django.contrib import adminfrom django.utils.translation import ugettext_lazy as _from django.contrib.auth.admin import UserAdmin as BaseUserAdminfrom django.contrib.auth import get_user_modelfrom django.contrib.auth.admin import UserAdminfrom .models import Userclass UserAdmin(BaseUserAdmin):  form = UserChangeForm  fieldsets = (      (None, {'fields': ('email', 'password', )}),      (_('Personal info'), {'fields': ('first_name', 'last_name')}),      (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',                                     'groups', 'user_permissions')}),      (_('Important dates'), {'fields': ('last_login', 'date_joined')}),        (_('user_info'), {'fields': ('native_name', 'phone_no')}),  )  add_fieldsets = (      (None, {          'classes': ('wide', ),          'fields': ('email', 'password1', 'password2'),      }),  )  list_display = ['email', 'first_name', 'last_name', 'is_staff', "native_name", "phone_no"]  search_fields = ('email', 'first_name', 'last_name')  ordering = ('email', )admin.site.register(User, UserAdmin)
Now create a serializers.py file in your app. Add following code to your serializers.py
Python3
from rest_framework import serializersfrom api.models import  Userclass UserSerializer(serializers.ModelSerializer):  class Meta:      model = User      fields = "__all__"
We are almost done. Now create api/urls.py  file inside you app and add following lines 
Python3
from django.contrib import adminfrom django.urls import pathfrom django.conf.urls import includeurlpatterns = [  path('auth/', include('rest_auth.urls')),]
Now add following code to the login/urls.py of your project 
Python3
from django.contrib import adminfrom django.urls import path urlpatterns = [  path('admin/', admin.site.urls),  path(" ", include("api.urls"))]
We are all set with the custom user model. Now save these changes to you project and makemigrations through CLI 
$ python manage.py makemigrations users
$ python manage.py migrate
Now create a superuser 
$ python manage.py createsuperuser

Email address: test@test.com

Password:

Password (again):

Superuser created successfully.
Now run server with. 
$ python manage.py runserver
surindertarika1234
rs1686740
Django-REST
Python Django
Python Framework
Python
Web Technologies
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Python Dictionary
Read a file line by line in Python
Enumerate() in Python
How to Install PIP on Windows ?
Different ways to create Pandas Dataframe
Roadmap to Become a Web Developer in 2022
Installation of Node.js on Linux
Top 10 Projects For Beginners To Practice HTML and CSS Skills
How to fetch data from an API in ReactJS ?
How to insert spaces/tabs in text using HTML/CSS?