Django ModelViewSet PATCH запрос возврата полей модели обновлен - PullRequest
0 голосов
/ 20 ноября 2018
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 содержало имя поля, измененное и новое значение только для подтверждения того, что изменение прошло успешно и ничего не пошло не так.

Так, например, если пользователь меняет имя на Билли. Ответ должен быть 200, а тело должно сказать {имя: 'Билли'}

Как мне это сделать?

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете попробовать вот так:

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

Здесь я поставил переопределение метода обновления.Затем я собрал данные словаря из текущего объекта и обновил объект.Затем сравнил их и отправил различия в словаре в качестве ответа. FYI это непроверенный код.

...