Python中DRF序列化器子类继承父类覆写字段属性的实现方法
实现代码
class AccessInternalSerializer(AccessSerializer): class Meta(AccessSerializer.Meta): model = Access # 从父类optional_fields中移除set_hidden_fields字段 optional_fields = tuple( field for field in AccessSerializer.Meta.optional_fields if field != "set_hidden_fields" ) extra_kwargs = { # 逐个将需要取消write_only的字段设置为False 'username': { 'write_only': False }, 'password': { 'write_only': False, 'trim_whitespace': False }, 'privileged_username': { 'write_only': False }, 'privileged_password': { 'write_only': False, 'trim_whitespace': False }, 'private_key': { 'write_only': False }, 'ca_cert': { 'write_only': False }, 'external_iam_fields': { 'read_only': True }, } # to_representation是序列化器的方法,不要缩进进Meta类内部 def to_representation(self, obj): data = super().to_representation(obj) data['ssh_private_key'] = obj.ssh_private_key data['ca_certificate'] = obj.ca_certificate return data
实现说明
- 移除
set_hidden_fields字段:父类的optional_fields是元组类型,无法直接删除元素,通过生成器表达式遍历父类的可选字段,过滤掉set_hidden_fields后重新生成元组赋值给子类的optional_fields即可。 - 取消字段
write_only限制:Django REST Framework的序列化器子类Meta中的extra_kwargs会覆盖父类同名字段的配置,只需要给对应字段显式设置write_only=False即可,原有其他字段配置(比如密码的trim_whitespace=False)可以保留继承,也可以显式写出确保配置生效。 - 额外注意点:原代码中
to_representation方法的缩进错误,它属于序列化器类的公共方法,不能放在Meta内部类中,否则不会生效。
内容的提问来源于stack exchange,提问作者stackuser
相关产品推荐
相关产品推荐

