自定义 djoser 创建用户端点

Posted

技术标签:

【中文标题】自定义 djoser 创建用户端点【英文标题】:Customize the djoser create user endpoint 【发布时间】:2018-08-12 05:17:50 【问题描述】:

我正在使用 djoser 进行身份验证。我想自定义 djoser 的创建用户端点。我有一个用户应用程序。这是我的用户模型

from django.db import models


class User(models.Model):
    email = models.CharField(max_length=100, blank=False)
    name = models.CharField(max_length=100, blank=False)
    last_name = models.CharField(max_length=100, blank=False)
    account_address = models.CharField(max_length=30, blank=False)
    password = models.CharField(max_length=100, blank=False)

这是我的序列化器

from rest_framework import serializers
from User.models import User


class UserSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = ('url', 'id', 'email', 'name', 'last_name', 'account_address', 'password')

我的 User.urls.py 如下所示

from django.conf.urls import url, include
from rest_framework.routers import DefaultRouter

from .views import UserViewSet

router = DefaultRouter()

urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^account/', include('djoser.urls')),
]

项目的 url.py 如下

from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^users/', include('User.urls')),
    url(r'^advertisements', include('advertisements.urls')),
    url(r'^account', include('wallet.urls')),
]

但是当我转到用户/帐户/创建时,我无法使用自定义模型创建用户,我看到了 djoser 的默认创建用户视图。任何人都请告诉我哪里做错了。谢谢:)

【问题讨论】:

【参考方案1】:

请记住,您已将 AUTH_USER_MODEL 设置为您的 User 模型。

只需导入 Djoser 用户注册序列化程序并覆盖它。

from djoser.serializers import UserCreateSerializer as BaseUserRegistrationSerializer

class UserRegistrationSerializer(BaseUserRegistrationSerializer):
    class Meta(BaseUserRegistrationSerializer.Meta):
        fields = ('url', 'id', 'email', 'name', 'last_name', 'account_address', 'password', )

如果您想自定义它,您还可以覆盖序列化程序中的其他内容,例如 create and update methods

在settings.py中

DJOSER = 
    ...
    'SERIALIZERS': 
         'user_create': 'yourapp.serializer.UserRegistrationSerializer'
    
    ...

【讨论】:

一旦DJOSER 中的DJOSER 对象包含user_create 新序列化程序,如您的示例中那样,DJOSER 是否应该自动选择此新序列化程序?还是应该定义一个连接到使用自定义序列化程序的自定义视图的自定义 URL?就像在您的示例中一样,我已经覆盖了设置和序列化程序,但是 Djoser 注册端点仅向我显示了默认的电子邮件/密码字段。我的注册 POST 请求如何也接受我在自定义注册序列化程序中定义的其他字段(例如 last_name),这些字段已经在我的 CustomUser 模型上? @FedericoCapaldo 它应该自动选择新的序列化程序。对于序列化程序不获取 last_name 字段,请确保您的元类继承 Djoser UserRegsitrationSerializer 元类,如上例所示。【参考方案2】:

对我来说,我想编写一个自定义创建方法,当我覆盖 user_create_password_retype 并使用我的方法时它起作用了,因为这是在内部使用来自 djoser 的 UserCreateSerializer

DJOSER = 
      ...
    "SERIALIZERS": 
        "user_create": "account.serializers.user_serializer.CustomUserCreateSerializer",
        "user": "account.serializers.user_serializer.CustomUserSerializer",
        "user_create_password_retype": "account.serializers.user_serializer.UserCreatePasswordRetypeSerializer",
    
      ...

其他设置 - AUTH_USER_MODEL 到您的自定义用户模型。

【讨论】:

以上是关于自定义 djoser 创建用户端点的主要内容,如果未能解决你的问题,请参考以下文章

在 Djoser 和 Rest Framework 中使用自定义字段注册用户

Djoser:触发用户帐户激活操作

如何在 Djoser 中禁用用户名更改?

如何从 djoser 端点(.../users/me)检索用户数据

DRF:Djoser 覆盖自定义用户序列化程序

MS Graph中的端点以获取SharePoint Online用户配置文件