Django DRF изменяет данные сериализатора с помощью CreateListModelMixin - PullRequest
0 голосов
/ 13 января 2019

У меня есть это представление класса, но я не могу изменить данные сериализатора для вставки дополнительных данных (которые необходимы и должны быть заполнены автоматически). Поскольку я создаю много экземпляров одновременно, сериализатор основан на kwargs ['many'] = True.

Есть идеи о том, как добавить еще одно поле в данные сериализатора?

Спасибо,

class ReservedServiceView(CreateListModelMixin, ModelViewSet):
queryset = ReservedService.objects.all()
serializer_class = ReservedServiceSerializer
authentication_classes = (authentication.TokenAuthentication,)

def perform_create(self, serializer):
    # Create an event that is a Reflection of the Reserved Service
    serializer_data = self.request.data

    for reserved_service in serializer_data:
        print("--------",reserved_service, flush=True)

        service_id = reserved_service['original_service']

        original_service = Service.objects.get(pk=service_id)

        calendar_event = CalendarEvent()
        calendar_event.name = original_service.name
        calendar_event.description = original_service.description
        calendar_event.date = reserved_service['date']
        calendar_event.type_id = 1
        calendar_event.start_time = reserved_service['start_time']
        calendar_event.end_time = reserved_service['end_time']
        calendar_event.location_id = original_service.location.id
        calendar_event.save()

        reserved_service['associated_event'] = calendar_event.id

    print("**********1", serializer_data)
    print("**********2", self.request.data)
    serializer.save()

На основании:

class CreateListModelMixin(object):
def get_serializer(self, *args, **kwargs):
    """ if an array is passed, set serializer to many """
    if isinstance(kwargs.get('data', {}), list):
        kwargs['many'] = True
    return super(CreateListModelMixin, self).get_serializer(*args, **kwargs)

1 Ответ

0 голосов
/ 13 января 2019

Я не могу правильно получить ваш вопрос, но если ваш вопрос в том, что вы не получаете дополнительные поля, которые вы добавили в сериализатор в ответе на просмотр, то вот ответ для него.

Ответ этого представления возвращается методом create CreateModelMixin, который передает serializer.data параметру data Response. Вы не можете обновить serializer.data, потому что это неизменный объект. Таким образом, для решения этой проблемы вам придется переопределить метод create следующим образом:

class ReservedServiceView(CreateListModelMixin, ModelViewSet):
    queryset = ReservedService.objects.all()
    serializer_class = ReservedServiceSerializer
    authentication_classes = (authentication.TokenAuthentication,)

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        my_data = {}.update(serializer.validated_data)
        # Now you can work over the my_data and add extra fields to it and save it 
        # and instead of passing serializer.data we pass my_data to Response class
        headers = self.get_success_headers(serializer.data)
        return Response(my_data, status=status.HTTP_201_CREATED, headers=headers)
...