Django REST Framework嵌套对象:POST与DELETE字段必填规则配置
解决方案
方案1:动态控制UserSerializer的字段必填性
给UserSerializer添加初始化参数,根据传入的参数动态调整字段的required属性,让同一个序列化器适配不同场景:
class UserSerializer(serializers.Serializer): email = serializers.EmailField(required=True) username = serializers.CharField(max_length=100, required=True) def __init__(self, *args, **kwargs): # 接收自定义参数,默认同时校验两个字段 required_fields = kwargs.pop('required_fields', ['email', 'username']) super().__init__(*args, **kwargs) # 只将指定字段设为必填,其余改为非必填 for field_name in self.fields: self.fields[field_name].required = field_name in required_fields class PostCommentSerializer(serializers.Serializer): # 发布评论时仅校验username必填 user = UserSerializer(required=True, required_fields=['username']) class DeleteCommentSerializer(serializers.Serializer): # 删除评论时仅校验email必填 user = UserSerializer(required=True, required_fields=['email'])
方案2:创建UserSerializer的场景子类
针对不同业务场景,定义UserSerializer的子类,各自指定必填字段,逻辑更直观:
class BaseUserSerializer(serializers.Serializer): # 基础序列化器,定义所有字段但不强制必填 email = serializers.EmailField(required=False) username = serializers.CharField(max_length=100, required=False) class PostUserSerializer(BaseUserSerializer): # 发布评论场景:仅username必填 username = serializers.CharField(max_length=100, required=True) class DeleteUserSerializer(BaseUserSerializer): # 删除评论场景:仅email必填 email = serializers.EmailField(required=True) class PostCommentSerializer(serializers.Serializer): user = PostUserSerializer(required=True) class DeleteCommentSerializer(serializers.Serializer): user = DeleteUserSerializer(required=True)
方案3:在父序列化器中自定义校验逻辑
如果不想修改UserSerializer,可以在父序列化器的字段校验方法里手动校验嵌套字段:
class UserSerializer(serializers.Serializer): email = serializers.EmailField(required=False) username = serializers.CharField(max_length=100, required=False) class PostCommentSerializer(serializers.Serializer): user = UserSerializer(required=True) def validate_user(self, value): if not value.get('username'): raise serializers.ValidationError('username为必填项') return value class DeleteCommentSerializer(serializers.Serializer): user = UserSerializer(required=True) def validate_user(self, value): if not value.get('email'): raise serializers.ValidationError('email为必填项') return value
内容的提问来源于stack exchange,提问作者brainoverflow
相关产品推荐
相关产品推荐

