Open In App

Creating custom user model using AbstractUser in django_Restframework

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

$ cd ~/Desktop$ mkdir code && cd code
$ pipenv install django

Make a new Django project called login

$ django-admin startproject login
$ python manage.py startapp api
$ pipenv install rest_framework




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',
  ),
}




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)




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)




from rest_framework import serializers
from api.models import  User
class UserSerializer(serializers.ModelSerializer):
  class Meta:
      model = User
      fields = "__all__"




from django.contrib import admin
from django.urls import path
from django.conf.urls import include
urlpatterns = [
  path('auth/', include('rest_auth.urls')),
]




from django.contrib import admin
from django.urls import path
 
urlpatterns = [
  path('admin/', admin.site.urls),
  path(" ", include("api.urls"))
]

$ python manage.py makemigrations users
$ python manage.py migrate
$ python manage.py createsuperuser

Email address: test@test.com

Password:

Password (again):

Superuser created successfully.
$ python manage.py runserver

Article Tags :