【问题标题】:Django ModelViewSet PATCH request return model fields updatedDjango ModelViewSet PATCH 请求返回模型字段已更新
【发布时间】:2019-04-22 12:12:04
【问题描述】:
class MerchantStampCardViewSet(viewsets.ModelViewSet):
    '''
    A view set for listing/retrieving/updating/deleting stamp cards for the current
    merchant
    '''
        permission_classes = (IsMerchantAndAuthenticated, )

def get_queryset(self):
    if len(MerchantProfile.objects.filter(user=self.request.user)) > 0:
        merchant_profile = MerchantProfile.objects.get(user=self.request.user)
        if merchant_profile.merchant:
            return StampCard.objects.filter(merchant=merchant_profile.merchant)
    return None

def get_serializer_class(self):
    if self.request.method == 'GET':
        return StampCardSerializerWithRewards
    else:
        return StampCardSerializer

我正在尝试使此代码返回响应正文中更改的字段。模型类有几个字段,如姓名、城市、省、邮政编码和地址,通过前端用户一次只能更改一个,但我希望 200 响应的正文包含更改的字段名称和新值只是为了确认更改成功并且没有出错。

例如,如果用户将名称更改为 Billy。响应应该是 200 并且正文应该是 {name : 'Billy'}

我该怎么做?

【问题讨论】:

  • 确认一下,您只想返回更新后的字段,而不是该对象的所有字段?
  • 是的!提前谢谢你

标签: django django-rest-framework


【解决方案1】:

你可以这样试试:

class YourViewSet(...):

  def update(self, request, *args, **kwargs):
    instance = self.get_object()
    current_data = self.get_serializer(instance).data  # collect current data
    # next few lines of the code is from default implementation
    serializer = self.get_serializer(instance, data=request.data, partial=partial)
    serializer.is_valid(raise_exception=True)
    self.perform_update(serializer)
    if getattr(instance, '_prefetched_objects_cache', None):
        instance._prefetched_objects_cache = {}

    updated_data = serializer.data  # now we get the updated data
    response_dict = dict()
    for key, value in current_data:
         # find the differences
         if updated_data.get(key) != value:
            response_dict[key] = updated_data.get(key)
    return Response(response_dict)  # send the difference through response

在这里,我对更新方法进行了覆盖。然后我从当前对象和更新对象中收集了字典数据。然后比较它们并在字典中发送差异作为响应。 仅供参考这是未经测试的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-05
    • 2015-03-05
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2012-05-10
    • 2014-01-03
    • 2019-04-06
    相关资源
    最近更新 更多