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

Posted

技术标签:

【中文标题】DRF:Djoser 覆盖自定义用户序列化程序【英文标题】:DRF: Djoser override custom user serializer 【发布时间】:2021-07-22 18:30:39 【问题描述】:

以前我一直在使用后端,但在几个月没有编码之后,我现在对现在的代码不太满意。所以我使用 Djoser,我的项目 settings.py 文件中有这个

  ...
    'SERIALIZERS': 
            'user_create': 'backend.accounts.serializers.UserCreateSerializer',
            'user': 'backend.accounts.serializers.UserCreateSerializer',
            'user_delete': 'djoser.serializers.UserDeleteSerializer',
    
  ...

这应该覆盖默认的 Djoser 序列化程序,但我可以看到它什么都不做。

/auth/users/me/ - 返回这个


    "email": "test@gmail.com",
    "id": 1,
    "username": "test"

但我在 backend/accounts/serializers

中有这个作为我的序列化程序
class UserCreateSerializer(UserCreateSerializer):
    delete_request = DeleteUserSerializer(read_only=True)

    class Meta(UserCreateSerializer.Meta):
        model = User
        fields = (
            'id',
            'email',
            'username',
            'password',
            'delete_request',
        )

为什么不覆盖?

【问题讨论】:

【参考方案1】:

/users/me/ 端点由 djoser 序列化程序字典中的 current_user 键处理,因此您应该添加它:

'SERIALIZERS': 
    # [...]
    'current_user': 'backend.accounts.serializers.UserSerializer',
    # [...]

您可以了解更多关于djoser serializers on the documentation的信息。

他们说:

键 'user' 用于一般用户,而 'current_user' 允许您为特殊的 /users/me 端点设置序列化程序。不过,它们都默认使用相同的序列化程序。

顺便说一句,我认为您应该为usercuttent_user 键创建一个继承自djoser.serializers.UserSerializer 而不是djoser.serializers.UserCreateSerializer 的序列化程序。

【讨论】:

以上是关于DRF:Djoser 覆盖自定义用户序列化程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 DRF 中序列化自定义用户模型

如何覆盖 Djoser 基本端点用户/我

序列化 DRF 中的自定义相关字段

CSIC_716_20200221drf--自定义外键字段十大接口

如何在实例中有自定义 .update() 以更新 DRF 可写嵌套序列化程序中的多对多关系时更新值

drf--ModelSerializers序列化