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
相关产品推荐
相关产品推荐

