DRF序列化器的update()方法
def update(self, instance, validated_data):
"""
重写DRF序列化器的update方法,实现用户档案的更新逻辑,特别优化头像处理流程
核心逻辑:
1. 优先处理头像字段的更新(如有)
2. 批量更新其他用户信息字段
3. 触发模型层的save方法完成持久化
4. 返回序列化后的完整用户档案数据
:param instance: 待更新的UserProfile模型实例
:param validated_data: 经过验证的请求数据字典
:return: 序列化后的更新结果(dict)
"""
# 使用海象运算符弹出并检查头像字段(Python 3.8+特性)
# 从验证数据中提取头像文件(如存在),并从字典中移除该键以避免后续重复处理
if avatar := validated_data.pop('avatar', None):
# 头像处理逻辑已在模型层实现优化(2025.07.23 Wednesday更新):
# 1. UserProfile.save()会自动检测旧头像并删除文件系统中的冗余文件
# 2. 模型层通过validators确保头像格式/尺寸符合企业级安全标准
# 3. 异步缩略图生成在视图层的perform_update中触发(见views.py)
instance.avatar = avatar
# 批量更新其他用户信息字段(非头像字段)
# 使用setattr动态赋值,避免硬编码字段名,提高代码可维护性
# 此时validated_data已排除avatar字段,仅包含其他可更新字段(如nickname/timezone)
for attr, value in validated_data.items():
setattr(instance, attr, value)
# 触发模型层save方法:
# - 自动处理旧头像文件删除(模型层delete_old_avatar逻辑)
# - 更新updated_at时间戳(auto_now=True特性)
# - 执行数据库持久化操作
instance.save()
# 返回序列化后的完整用户档案数据:
# 1. 遵循RESTful API最佳实践,更新后返回完整资源表示
# 2. to_representation方法会自动处理关联数据和URL生成(如avatar_url)
# 3. 确保客户端获得最新的资源状态,包括头像URL等计算字段
return self.to_representation(instance)