Django REST Framework中serializer的update方法使用与简化咨询
DRF Serializer中update()方法的简化实现方案
核心逻辑
你当前需要逐行赋值的原因是额外处理了多对多关系字段(beneficiary、section),而普通字段的更新逻辑DRF的ModelSerializer已经内置实现,无需手动编写。
简化实现代码
如果你的序列化器继承自ModelSerializer,直接调用父类update处理普通字段,仅单独处理多对多字段即可:
def update(self, instance, validated_data): # 提前取出多对多字段数据,避免父类处理时报错 beneficiary_data = validated_data.pop('beneficiary', None) section_data = validated_data.pop('section', None) # 父类方法自动完成所有普通字段的赋值、保存逻辑 instance = super().update(instance, validated_data) # 单独处理多对多关系 if beneficiary_data is not None: instance.beneficiary.set([beneficiary_data]) if section_data is not None: instance.section.set([section_data]) return instance
非ModelSerializer场景的简化方案
如果你的序列化器继承自基础Serializer,可以通过遍历validated_data统一赋值普通字段,无需逐行编写:
def update(self, instance, validated_data): beneficiary_data = validated_data.pop('beneficiary', None) section_data = validated_data.pop('section', None) # 遍历赋值所有普通字段 for attr, value in validated_data.items(): setattr(instance, attr, value) instance.save() # 处理多对多关系 if beneficiary_data is not None: instance.beneficiary.set([beneficiary_data]) if section_data is not None: instance.section.set([section_data]) return instance
注意事项
- 使用
pop方法移除多对多字段是为了避免父类处理普通字段时,遇到不支持直接赋值的关系字段抛出异常 - 仅当你需要对特定字段做自定义处理(比如加密、逻辑计算赋值、嵌套序列化器更新)时,才需要单独编写对应字段的赋值逻辑
内容的提问来源于stack exchange,提问作者user15361826
相关产品推荐
相关产品推荐

