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

Django REST Framework PUT请求返回200但数据库未更新求助

问题:PUT请求返回200但数据库未更新,Django Admin更新正常

我尝试通过PUT请求更新数据库,在Django Admin中可以成功更新,但使用PUT请求时,虽返回200 OK无报错,数据库数据却未更新,附上相关代码寻求帮助:

models.py

class User_Order(models.Model):
    order = models.OneToOneField(Orders, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    id = models.IntegerField(primary_key=True)
    shirts = models.IntegerField(default=0)
    shorts = models.IntegerField(default=0)
    trousers = models.IntegerField(default=0)

    total_units = models.CharField(max_length=2000, blank=True)
    
    shirts_amount = models.CharField(max_length=2000, blank=True)
    shorts_amount = models.CharField(max_length=2000, blank=True)
    trousers_amount = models.CharField(max_length=2000, blank=True)
    
    total = models.CharField(max_length=200,blank=True)
    
    verified = models.BooleanField(null=True)
    doing_laundry = models.BooleanField(null=True)
    delivery_underway = models.BooleanField(null=True)
    delivered = models.BooleanField(null=True)

    address = models.TextField(default='')

    time = models.DateTimeField(auto_now=True)
    
    def save(self, *args, **kwargs):
        self.user = self.order.user
        self.id = self.order.id
        self.shirts = self.order.shirts
        self.shorts = self.order.shorts
        self.trousers = self.order.trousers
        self.total_units = self.order.total_units
        self.shirts_amount = self.order.shirts_amount
        self.shorts_amount = self.order.shorts_amount
        self.trousers_amount = self.order.trousers_amount
        self.total = self.order.total
        self.verified = self.order.verified
        self.doing_laundry = self.order.doing_laundry
        self.delivery_underway = self.order.delivery_underway
        self.delivered = self.order.delivered
        self.address = self.order.address

        super().save(*args, **kwargs)

    def __str__(self):
        return f'{self.order.user.username} Order'

serializers.py

class UserUser_OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = User_Order
        fields = '__all__'

views.py

@api_view(['PUT'])
def UserOrdersUpdate(request, pk):
    permission_classes = [IsAuthenticated]
    user_order = User_Order.objects.get(id=pk)
    if request.method == 'PUT':

        serializer = UserUser_OrderSerializer(instance=user_order, data=request.data, many = False, partial=True)

    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)

问题原因

核心问题出在User_Order模型重写的save方法上:每次调用save()(包括序列化器触发的保存),都会把所有字段的值从关联的order对象同步过来,直接覆盖了你通过PUT请求传入的更新值。

Django Admin更新正常是因为Admin保存逻辑未触发自定义的save覆盖,或是你在Admin中同时更新了关联的order对象,导致同步后的值符合预期。

解决方案

1. 修改模型save方法,仅创建时同步order数据

如果User_Order字段仅需在创建时从order同步,后续更新独立操作,修改save方法:

def save(self, *args, **kwargs):
    # 仅在创建新对象(无主键)时同步order数据
    if not self.pk:
        self.user = self.order.user
        self.id = self.order.id
        self.shirts = self.order.shirts
        self.shorts = self.order.shorts
        self.trousers = self.order.trousers
        self.total_units = self.order.total_units
        self.shirts_amount = self.order.shirts_amount
        self.shorts_amount = self.order.shorts_amount
        self.trousers_amount = self.order.trousers_amount
        self.total = self.order.total
        self.verified = self.order.verified
        self.doing_laundry = self.order.doing_laundry
        self.delivery_underway = self.order.delivery_underway
        self.delivered = self.order.delivered
        self.address = self.order.address
    super().save(*args, **kwargs)

2. 修复视图权限验证与响应逻辑

原视图中permission_classes写法不生效,需改用装饰器形式,同时完善异常处理:

from rest_framework import status
from rest_framework.decorators import permission_classes

@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def UserOrdersUpdate(request, pk):
    try:
        user_order = User_Order.objects.get(id=pk)
    except User_Order.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)
    
    serializer = UserUser_OrderSerializer(instance=user_order, data=request.data, partial=True)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    # 序列化失败时返回错误信息
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

3. 可选:限制API可更新字段

如果仅允许API更新状态类字段,可修改序列化器指定字段范围:

class UserUser_OrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = User_Order
        fields = ['verified', 'doing_laundry', 'delivery_underway', 'delivered']

内容的提问来源于stack exchange,提问作者Khal Shaphat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:39:40