如何使用super()方法修改基类if条件内的变量,实现子类序列化器逻辑扩展
实现代码
你可以按照如下方式实现SerializerTwo,不需要修改原有基类逻辑:
class SerializerOne(BaseSerializer): pass class SerializerTwo(BaseSerializer): def validate(self, data): # 调用父类validate方法获取基础处理后的data data = super().validate(data) # 复用父类相同的instance构造逻辑 instance = self.instance or self.Meta.model(**data) # 仅在满足条件时追加ca字段 if data.get('certificate') and data.get('private_key'): data.update({'ca': instance.ca}) return data def validate_validity_end(self, value): # 直接重写该方法覆盖父类默认值逻辑即可 if value is None: value = default_cert_validity_end() return value
优化方案(可选)
如果希望避免子类重复判断条件、重复构造instance,可以调整基类增加扩展钩子,后续新增子类时只需要实现对应钩子即可:
class BaseSerializer(object): def validate(self, data): instance = self.instance or self.Meta.model(**data) instance.full_clean() if data.get('certificate') and data.get('private_key'): data = get_import_data(instance) # 新增扩展钩子,子类可以按需实现 data = self.extend_import_data(data, instance) return data # 基类默认钩子实现,不做任何修改 def extend_import_data(self, data, instance): return data # 其余方法保持不变 def validate_validity_start(self, value): if value is None: value = default_validity_start() return value def validate_validity_end(self, value): if value is None: value = default_ca_validity_end() return value
调整后SerializerTwo的实现会更简洁:
class SerializerTwo(BaseSerializer): def extend_import_data(self, data, instance): data.update({'ca': instance.ca}) return data def validate_validity_end(self, value): if value is None: value = default_cert_validity_end() return value
内容的提问来源于stack exchange,提问作者Manish Shah
相关产品推荐
相关产品推荐

