You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:51:04