如何覆盖Djoser基本端点users/me



我对Djoser有点陌生,我想做的是,当经过身份验证的用户导航到users/meAPI端点时,它会返回用户id电子邮件和名称。我希望它也能返回自定义信息,我该怎么做?

虽然这可能只回答了一半的问题,但如果您使用自定义用户,则需要添加一个REQUIRED_FIELDS=['field_you_want_included']

例如,这就是我的一个自定义用户配置文件的样子。

class CustomUser(AbstractUser):
username = None
user_id = models.UUIDField(default=uuid4, primary_key=True, editable=False)
email = models.EmailField(_('email address'), unique=True)
receive_news = models.BooleanField(null=True, blank=True, default=False)
birth_date = models.DateField(null=True, blank=True)
is_premium = models.BooleanField(default=True)
USERNAME_FIELD = 'email'
# FIELDS HERE WILL BE ADDED TO USERS/ME ENDPOINT
REQUIRED_FIELDS = ['is_premium']
objects = UserAccountManager()

有很多关于用djoser创建自定义用户的信息,所以这里重要的是required_fields列表。现在,当生成一个get-to-users/me时,它还将包括"is_premium"。然而,对于更复杂的包含,我会尝试覆盖视图&串行器。我自己还没有尝试过,但如果我做了,我会编辑这篇文章。

Djoser只是一个Django应用程序。只需用自己的类覆盖Djoser的类,并将您的auth URL指向那些类,而不是包中的类。我不得不这样做,这是我所做的事情的样本。
from djoser.views import TokenDestroyView as DjoserTokenDestroyView
from djoser.views import UserViewSet
class CustomUserViewSet(UserViewSet):
"""
Overriding djoser's Users view
"""
@extend_schema(summary="Me", responses={200: LoginSerializer, 404: UserNotFoundResponse, 401: FailedLogin})
@action(["get", "put"], detail=False)
def me(self, request, *args, **kwargs):
"""
get the current User's data and KPIs settings
"""
if request.method == MethodsNames.GET.upper():
user = User.objects.filter(email=self.get_instance()).select_related(ACCOUNT).prefetch_related(
RelatedNames.AUTH_TOKEN,
'account__bundles', 'account__bundles__bundle_kpis',
RelatedNames.USER_SELECTED_KPIS)[0]
user_data = LoginSerializer(user, many=False)
return Response(user_data.data)
# some more overriding here...

然后我的url文件看起来像:

from django.conf.urls import url
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from users.views import TokenCreateView, CustomUserViewSet, TokenDestroyView
users = DefaultRouter()
users.register("users", CustomUserViewSet, basename='users')
login = DefaultRouter()
login.register('token', TokenCreateView, basename='login')
urlpatterns = [
path('', include(login.urls)),
path('', include(users.urls)),
url(r"^token/logout/?$", TokenDestroyView.as_view(), name="logout"),
]

而不是(来自Djoser文档(:

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

在您的设置文件中添加此

DJOSER = {
# 
'SERIALIZERS': {
'user_create': 'customuser.serializer.UserSerializerCreate',
'user' : 'customuser.serializer.UserSerializer',
},

}

最新更新