eagleye

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)

 

posted on 2025-07-23 17:31  GoGrid  阅读(12)  评论(0)    收藏  举报

导航