You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:54:03