You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:25:31