在Django中扩展AbstractUser创建自定义用户模型API

在Django中扩展AbstractUser创建自定义用户模型API

每个新的Django项目都应该使用一个自定义的用户模型。Django官方文档说这是 “强烈推荐”,但我要更进一步,毫不犹豫地说。如果你不在前面使用自定义用户模型,那你就直接疯了。

为什么在Django中需要一个自定义的用户模型?

当你用一个自定义的用户模型开始你的项目时,停下来考虑这是否是你项目的正确选择。将所有的用户相关信息保存在一个模型中,就不需要额外的或更复杂的数据库查询来检索相关模型。另一方面,在一个与你的自定义用户模型有关系的模型中存储特定应用的用户信息可能更合适。这允许每个应用程序指定它自己的用户数据要求,而不可能与其他应用程序的假设冲突或破坏。这也意味着你会尽可能地保持你的用户模型的简单性,专注于认证,并遵循Django期望自定义用户模型满足的最低要求。

所以我想我们很清楚为什么在django中需要一个自定义用户模型,在这篇文章中我们将学习如何在django中创建自定义用户模型和它的api,现在让我们开始编码部分。

搭建–

  • 为我们的代码创建并导航到一个名为用户的专用目录。

  • 新建一个名为login的Django项目

  • 做出一个新的应用程序的用户

  • 启动本地网络服务器

命令–

$ cd ~/Desktop  
$ mkdir code && cd code
$ pipenv install django
$ pipenv shell
$ django-admin startproject login
$ python manage.py startapp api
$ pipenv install rest_framework

现在,在settings.py中添加以下代码。

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

在这之后,我们需要创建一个自定义的用户模型。为此,改变你的models.py文件,如下所示。在这里,我们正在扩展AbstractUser,并将认证凭证改为Email。我们还在我们的自定义用户中添加一些额外的字段

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)

在这之后,我们需要把这些变化也保存到管理面板上。将这段代码添加到admin.py中

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)

现在在你的应用程序中创建一个serializers.py文件。在你的serializers.py中添加以下代码

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

现在在你的应用程序中创建api/urls.py文件并添加以下几行

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

现在,在你的项目的login/urls.py中添加以下代码

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

我们已经完成了自定义用户模型的设置。现在将这些变化保存到你的项目中,并通过CLI进行迁移

$ 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

并通过该URL。你可以在管理面板中检查你的自定义用户

输出–

在Django中扩展AbstractUser创建自定义用户模型API

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程