如何自定义Python Djoser包创建用户时的返回响应格式
自定义Djoser注册成功后的返回格式
要实现你想要的嵌套返回结构,有两种实用方案,优先推荐第一种(仅针对注册接口生效,不会影响其他接口):
方案一:重写RegisterView视图
Djoser的注册逻辑由RegisterView处理,我们可以继承它并修改响应输出:
- 在你的项目视图文件(比如
views.py)中创建自定义视图:
from djoser.views import RegisterView from rest_framework.response import Response class CustomRegisterView(RegisterView): def create(self, request, *args, **kwargs): # 先调用父类的create方法拿到默认响应 original_response = super().create(request, *args, **kwargs) # 包装成你想要的格式 custom_response_data = { "data": original_response.data, "success": True } # 返回新的响应,保持原状态码 return Response(custom_response_data, status=original_response.status_code)
- 替换Djoser默认的注册路由
在urls.py里覆盖默认的注册路由,指向我们的自定义视图:
from django.urls import path, include from .views import CustomRegisterView urlpatterns = [ # 保留Djoser的其他路由 path('auth/', include('djoser.urls')), # 覆盖注册接口路由 path('auth/users/', CustomRegisterView.as_view(), name='custom_user_register'), ]
这样修改后,注册成功就会返回你期望的格式:
{ "data": { "email": "test14@user.com", "id": 17, "first_name": "reni", "last_name": "brake" }, "success": true }
方案二:重写序列化器的to_representation方法
如果你不想修改视图,也可以在你的RegisterSerializer中重写to_representation方法,但要注意:这个方法会影响所有使用该序列化器的场景(比如用户详情接口),所以谨慎使用:
class RegisterSerializer(UserCreatePasswordRetypeSerializer): first_name = serializers.CharField(max_length=100) last_name = serializers.CharField(max_length=100) class Meta(UserCreatePasswordRetypeSerializer.Meta): model = get_user_model() fields = UserCreatePasswordRetypeSerializer.Meta.fields + ("first_name", "last_name") def to_representation(self, instance): # 获取默认序列化数据 original_data = super().to_representation(instance) # 包装成目标格式 return { "data": original_data, "success": True }
内容的提问来源于stack exchange,提问作者Onengiye Richard
相关产品推荐
相关产品推荐

