django - 尽管字段为空,但序列化器 is_valid() 返回 true
问题描述
我尝试使用基于函数的视图运行代码,它运行良好,然后我尝试切换到 modelViewSet。
这是我的序列化程序代码:
用户序列化器
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
username = serializers.CharField(required=True)
email = email = serializers.EmailField(validators=[UniqueValidator(queryset=get_user_model().objects.all())])
phone = serializers.CharField(required=True)
full_name = serializers.CharField(required=True)
user_type = serializers.CharField(required=True)
password = serializers.CharField(write_only=True)
fields=('username', 'email', 'phone', 'full_name', 'user_type','password')
def create(self, validated_data):
user = get_user_model().objects.create(
username=validated_data['username'],
email=validated_data['email'],
phone=validated_data['phone'],
full_name=validated_data['full_name'],
user_type=validated_data['user_type']
)
user.set_password(validated_data['password'])
user.save()
return user
这是我的模型视图集:
class RegisterView(viewsets.ModelViewSet):
queryset = ''
def create(self, request):
if request.data.get('user', dict()).get('user_type') == 'employee':
userSerializer = UserSerializer(data=request.data.get('user', dict()))
if userSerializer.is_valid(raise_exception=ValueError):
serializer = EmployeeSerializer(data=request.data)
if serializer.is_valid(raise_exception=ValueError):
serializer.create(validated_data=request.data)
return Response(serializer.data, status=HTTP_201_CREATED)
return Response(serializer.error_messages,
status=HTTP_400_BAD_REQUEST)
def get_serializer_class(self):
if self.request.data.get('user', dict()).get('user_type') == 'employee':
return EmployeeSerializer
if self.request.data.get('user', dict()).get('user_type') == 'customer':
return CustomerSerializer
if self.action == 'customer':
return CustomerSerializer
return EmployeeSerializer
现在,如果我不传递用户名或密码,那么 userSerializer 的 is_valid 会给出错误,但如果我不传递电子邮件或电话或 full_name is_valid 不会引发任何异常,它仍然是正确的。
它与基于函数的视图一起正常工作,或者我可能遗漏了一些东西。
我担心的是,如果 request.data 中缺少任何值,它应该会出错
解决方案
序列化器的字段应该定义为序列化器的属性而不是元的属性:
class UserSerializer(serializers.ModelSerializer):
username = serializers.CharField(required=True)
email = serializers.EmailField(validators=[UniqueValidator(queryset=get_user_model().objects.all())])
phone = serializers.CharField(required=True)
full_name = serializers.CharField(required=True)
user_type = serializers.CharField(required=True)
password = serializers.CharField(write_only=True)
class Meta:
model = get_user_model()
fields=('username', 'email', 'phone', 'full_name', 'user_type','password')
使用您当前的代码required=True
参数无效。
推荐阅读
- typescript - Typescript:如何扩展嵌套字段的接口并为对象赋值?
- uproot - Uproot:AttributeError:“模块”对象没有属性“打开”
- python - 提取月份数据并找到一列的平均值
- nginx - nginx上传文件并改名
- angular - 生成
的价值优先 的占位符 - angular - Angular 6 复选框多过滤器
- python - 根据最近更新的数据框行分离?
- php - 如果字段具有空白值,Codeigniter 表单验证器所需的规则第二次不起作用
- html - HTML日期控件的日期时间格式
- java - 使用带有 MapStruct 的构建器将空值映射到默认值