如何在Django REST Framework的Djoser中扩展/users/me/接口返回字段
完全可以通过Djoser的/users/me/接口实现该需求,具体操作步骤如下:
1 扩展用户存储字段
根据项目阶段二选一即可:
- 方案1:继承
AbstractUser扩展原生用户模型(适合项目初期未执行用户表迁移的场景)
# 你的应用/models.py from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): date_of_birth = models.DateField(null=True, blank=True) country = models.CharField(max_length=100, null=True, blank=True) marital_status = models.CharField(max_length=20, null=True, blank=True)
配置settings.py指定用户模型后执行迁移即可:
AUTH_USER_MODEL = "你的应用名.CustomUser"
- 方案2:单独创建Profile模型关联用户(适合项目已完成用户表迁移的场景)
# 你的应用/models.py from django.db import models from django.contrib.auth import get_user_model from django.db.models.signals import post_save from django.dispatch import receiver User = get_user_model() class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") date_of_birth = models.DateField(null=True, blank=True) country = models.CharField(max_length=100, null=True, blank=True) marital_status = models.CharField(max_length=20, null=True, blank=True) # 自动为新注册用户创建关联Profile对象 @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: UserProfile.objects.create(user=instance)
2 自定义Djoser序列化器
区分注册和资料修改场景的序列化器,保证注册阶段仅要求填写用户名、邮箱、密码三个必填参数:
# 你的应用/serializers.py from djoser.serializers import UserCreateSerializer, UserSerializer from rest_framework import serializers from django.contrib.auth import get_user_model User = get_user_model() # 注册专用序列化器,仅保留注册必填字段 class CustomUserCreateSerializer(UserCreateSerializer): class Meta(UserCreateSerializer.Meta): model = User fields = ("id", "username", "email", "password") # ------------方案1:用AbstractUser扩展的话用这个序列化器------------ class CustomUserSerializer(UserSerializer): class Meta(UserSerializer.Meta): model = User fields = UserSerializer.Meta.fields + ("date_of_birth", "country", "marital_status") # ------------方案2:用Profile模型扩展的话用这个序列化器------------ # class CustomUserSerializer(UserSerializer): # date_of_birth = serializers.DateField(source="profile.date_of_birth") # country = serializers.CharField(source="profile.country") # marital_status = serializers.CharField(source="profile.marital_status") # # class Meta(UserSerializer.Meta): # model = User # fields = UserSerializer.Meta.fields + ("date_of_birth", "country", "marital_status") # # # 重写更新逻辑同步修改Profile表字段 # def update(self, instance, validated_data): # profile_data = validated_data.pop("profile", {}) # instance = super().update(instance, validated_data) # for attr, value in profile_data.items(): # setattr(instance.profile, attr, value) # instance.profile.save() # return instance
3 配置Djoser参数
在项目settings.py中指定Djoser使用你自定义的序列化器:
DJOSER = { "SERIALIZERS": { "user_create": "你的应用名.serializers.CustomUserCreateSerializer", "user": "你的应用名.serializers.CustomUserSerializer", "current_user": "你的应用名.serializers.CustomUserSerializer", }, }
接口使用方式
用户完成注册、登录获取JWT令牌后,在请求头携带Authorization: Bearer <你的JWT令牌>请求/users/me/接口即可:
- 发送
GET请求,会返回包含所有额外字段的用户完整资料 - 发送
PUT/PATCH请求,传入需要修改的额外字段参数,即可完成资料更新
注意:如果使用Profile模型方案,需要配置对应权限规则,保证用户仅能修改自己的关联资料
内容的提问来源于stack exchange,提问作者C-Bizz
相关产品推荐
相关产品推荐

