Django REST Framework中如何更新Abstract User模型的device_id字段
在Django REST Framework中仅更新User模型的device_id字段的实现方案
要实现仅更新自定义User模型的device_id字段,无需大幅改动现有代码,有两种简洁的实现方式可选:
方案一:利用现有序列化器,通过PartialUpdateAPIView实现部分更新
DRF的PartialUpdateAPIView原生支持部分字段更新,只需传递需要修改的字段即可,无需传全量数据。
步骤1:添加视图到views.py
from rest_framework import generics from rest_framework.permissions import IsAuthenticated from .models import User from .serializers import UserSerializer class UserDeviceUpdateView(generics.PartialUpdateAPIView): queryset = User.objects.all() serializer_class = UserSerializer permission_classes = [IsAuthenticated] # 仅允许登录用户操作 def get_object(self): # 直接返回当前登录用户,无需通过URL传递用户ID return self.request.user
步骤2:配置路由
在项目urls.py中添加路由:
path('user/update-device/', UserDeviceUpdateView.as_view(), name='update-device'),
使用方式
前端发送PATCH请求到上述路由,请求体仅需包含device_id字段:
{ "device_id": "new_unique_device_id_xxx" }
此时只会更新device_id字段,其他字段保持不变。
方案二:创建专属序列化器和视图,严格控制更新字段
如果需要严格限制仅能修改device_id,避免其他字段被意外更新,推荐创建专门的序列化器和视图:
步骤1:添加专属序列化器到serializers.py
class DeviceIDUpdateSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['device_id'] # 仅暴露device_id字段 def update(self, instance, validated_data): # 手动处理更新逻辑,确保仅修改device_id instance.device_id = validated_data.get('device_id', instance.device_id) instance.save() return instance
步骤2:添加视图到views.py
from rest_framework import generics from rest_framework.permissions import IsAuthenticated from .models import User from .serializers import DeviceIDUpdateSerializer class DeviceIDUpdateView(generics.UpdateAPIView): queryset = User.objects.all() serializer_class = DeviceIDUpdateSerializer permission_classes = [IsAuthenticated] def get_object(self): return self.request.user
步骤3:配置路由
path('user/update-device-id/', DeviceIDUpdateView.as_view(), name='update-device-id'),
使用方式
同样发送PATCH请求,请求体仅传device_id即可,此方案下序列化器仅接收该字段,完全杜绝其他字段被修改的可能。
方案对比
- 方案一快捷高效,复用现有
UserSerializer,适合未来可能需要更新其他字段的场景; - 方案二更严谨安全,严格限定更新范围,适合对字段修改权限有严格要求的场景。
内容的提问来源于stack exchange,提问作者Peshangay Aram
相关产品推荐
相关产品推荐

