使用source参数时,如何将模型验证传递给ModelSerializer?
问题
在Django REST Framework序列化器中,为适配API需求将模型字段重命名(比如把模型的telephone_number改为API返回的phoneNumber),但手动定义重命名字段后,序列化器未复用模型的验证规则,比如原模型的max_length=15未生效:
模型代码:
class User(models.Model): name = models.CharField(max_length=50, null=True) telephone_number = models.CharField(max_length=15, null=True, blank=True)
原序列化器代码:
class UserSerializer(serializers.ModelSerializer): phoneNumber = serializers.CharField(source='telephone_number') class Meta: model = User fields = ('name', 'telephone_number')
执行结果显示phoneNumber字段缺少模型定义的验证规则:
>>> serializer = UserSerializer() >>> print(repr(serializer)) UserSerializer(): name = CharField(allow_null=True, max_length=50, required=False) phoneNumber = CharField(source='telephone_number') # 无max_length等验证规则
如何在不重复定义验证规则的前提下,复用模型的原有验证逻辑?(实际模型规模较大,重复定义成本高)
解决方案
不要手动显式定义重命名的字段,而是通过序列化器Meta类的extra_kwargs配置字段别名与原模型字段的映射,DRF会自动从模型字段继承所有验证规则:
修改后的序列化器代码:
class UserSerializer(serializers.ModelSerializer): class Meta: model = User # 填写API对外暴露的字段名,包含重命名后的phoneNumber fields = ('name', 'phoneNumber') extra_kwargs = { # 映射API字段名到模型原字段 'phoneNumber': {'source': 'telephone_number'} }
效果验证
此时查看序列化器的字段定义,phoneNumber已自动继承模型telephone_number字段的所有验证规则:
>>> serializer = UserSerializer() >>> print(repr(serializer)) UserSerializer(): name = CharField(allow_null=True, max_length=50, required=False) phoneNumber = CharField(allow_blank=True, allow_null=True, max_length=15, required=False, source='telephone_number')
原理说明
手动定义phoneNumber = serializers.CharField(source='telephone_number')时,相当于创建了一个独立的CharField实例,DRF不会自动关联模型字段的验证规则。而通过extra_kwargs配置source,DRF会基于模型的telephone_number字段自动生成对应的序列化字段,仅修改对外暴露的字段名,同时完整保留模型定义的验证逻辑。
内容的提问来源于stack exchange,提问作者Gustaw Ohler
相关产品推荐
相关产品推荐

