Creating custom user model using AbstractUser in django_Restframework
Last Updated :
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.
Why do u need a custom user model in Django?
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
Steps to create Custom User Model
- Create and navigate into a dedicated directory called users for our code
$ cd ~/Desktop$ mkdir code && cd code
$ 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 models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
from datetime import date
class 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 admin
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from .models import User
class 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 serializers
from api.models import User
class 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 admin
from django.urls import path
from django.conf.urls import include
urlpatterns = [
path('auth/', include('rest_auth.urls')),
]
- Now add following code to the login/urls.py of your project
Python3
from django.contrib import admin
from 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
$ python manage.py createsuperuser
Email address: [email protected]
Password:
Password (again):
Superuser created successfully.
$ python manage.py runserver
Similar Reads
Creating custom user model API extending AbstractUser in Django 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. Why do u need a custom user model in Django? When you s
4 min read
Creating and Using Serializers - Django REST Framework In Django REST Framework the very concept of Serializing is to convert DB data to a datatype that can be used by javascript. Serializers allow complex data such as querysets and model instances to be converted to native Python datatypes that can then be easily rendered into JSON, XML or other conten
3 min read
Creating multiple user types and using proxy models in Python Django In this article, we will understand the concept of the proxy model and the implementation of multiple user types depending on the requirements of your application in Django. What is the Proxy model in Django? An inherited proxy model can have a few extra functionalities, methods, and different behav
9 min read
How to create Abstract Model Class in Django? Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of Web development, so you can focus on writing your app without needing to reinvent the wheel. Itâs free and open source. W
2 min read
How to Create a basic API using Django Rest Framework ? Django REST Framework (DRF) is a powerful extension of Django that helps you build APIs quickly and easily. It simplifies exposing your Django models as RESTfulAPIs, which can be consumed by frontend apps, mobile clients or other services.Before creating an API, there are three main steps to underst
4 min read
Create URL Bookmark Manager Using Django This article explains how to make a tool called a Bookmark Organizer with Django for a website. With this tool, we can add, create, update, delete, and edit bookmarks easily. We just need to input the title and link, and we can save them. Then, we can click on the link anytime to visit the website.
5 min read