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

Django中使用OneToOne字段创建多类型用户及API序列化器实现方法

现有代码问题前置修正

先修改几个基础bug,否则功能无法正常运行:

  • UserManager的Types枚举配置错误:COMPANY = "COMPANY", "Customer"要改为COMPANY = "COMPANY", "Company",避免类型展示名异常
  • Customer模型的email字段末尾缺少右括号,补全为email = models.EmailField(_('email address'))
  • User模型的USERNAME_FIELD配置不合理:设置为自增id无法用于登录认证,建议改为email,同时REQUIRED_FIELDS移除password(密码属于特殊字段会单独处理)
  • CustomerSerializer的user字段配置错误:OneToOne关系不需要many=True,且要接收前端传入的用户参数不能设置read_only=True,需要先定义可写的UserSerializer
CustomerSerializer create方法实现

完整实现代码如下:

# 先补充定义可写的UserSerializer
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ["password", "contact", "email"]
        # 密码设为只写,避免返回给前端
        extra_kwargs = {
            'password': {'write_only': True}
        }

class CustomerSerializer(serializers.ModelSerializer):
    # 修正user字段配置
    user = UserSerializer()
    class Meta:
        model = Customer
        fields = "__all__"

    def create(self, validated_data):
        # 提取嵌套的用户数据
        user_data = validated_data.pop('user')
        # 创建类型为CUSTOMER的基础用户实例
        user = User.objects.create_user(
            email=user_data['email'],
            password=user_data['password'],
            contact=user_data.get('contact'),
            type=UserManager.Types.CUSTOMER
        )
        # 关联创建Customer实例
        customer = Customer.objects.create(user=user, **validated_data)
        return customer
接口请求示例

调用创建Customer接口时,传入的JSON参数格式参考:

{
  "name": "张三",
  "email": "zhangsan@example.com",
  "user": {
    "password": "test@123456",
    "contact": "13800138000",
    "email": "zhangsan@example.com"
  }
}

内容的提问来源于stack exchange,提问作者somya goyal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:27:03