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
相关产品推荐
相关产品推荐

