상황

@swagger_auto_schema(operation_description="학생 수업 스케줄 예약 변경",
                         operation_id='update student class schedule',
                         request_body=openapi.Schema(
                             type=openapi.TYPE_OBJECT,
                             properties={
                                 'old_schedule': openapi.Schema(type=openapi.TYPE_ARRAY,
                                                                items=openapi.Items(openapi.TYPE_OBJECT,
                                                                                    properties={
                                                                                        'schedule_id': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER)})),
                                 'new_schedule': openapi.Schema(type=openapi.TYPE_ARRAY,
                                                                items=openapi.Items(openapi.TYPE_OBJECT,
                                                                                    properties={
                                                                                        'schedule_event_detail_id': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER),
                                                                                        'user_id': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'day_code': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER),
                                                                                        'type_code': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER),
                                                                                        'ref_id': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER),
                                                                                        'name': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'description': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'memo': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'block_time': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER),
                                                                                        'location': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'meet_id': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'max_attendee': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER),
                                                                                        'min_attendee': openapi.Schema(
                                                                                            type=openapi.TYPE_INTEGER),
                                                                                        'start_date': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'end_date': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'start_time': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING),
                                                                                        'end_time': openapi.Schema(
                                                                                            type=openapi.TYPE_STRING)}))}))

위와 같은 request data 중 new_schedule의 데이터만을 가지고 다른 함수의 request data를 만들어 호출하려 한다.

 

* swagger_auto_schema는 다음에 다루도록 하겠다.

 

 

해결

    def update(self, request, user_id, article_id):
        try:

            ...

	    request._full_data = request.data['new_schedule']
            self.create(self, request, user_id, article_id)
            return Response(status=status.HTTP_200_OK)

        except:
            traceback.print_exc()

            return Response(status=status.HTTP_400_BAD_REQUEST)

 

로직 자체는 간단하다.

 

update 함수에서는 기존 데이터들의 status를 INACTIVE로 변경하고 (코드 생략)

받아온 data로 새로운 request data를 만들고, create 함수를 호출하여 새로운 레코드를 생성하는 것이다.

 

request._full_data = request.data['new_schedule']

위의 코드가 해당 역할을 한다. request._full_data 를 통해 request data를 수정할 수 있다.

 

 

References

https://www.edureka.co/community/74076/how-can-modify-request-data-in-django-rest-framework

'Django' 카테고리의 다른 글

Django - N+1 Problem  (0) 2021.10.07
Django - update 전 후 쿼리 결과의 변화(Lazy Loading)  (0) 2021.09.27
Django object has no attribute 'update'  (0) 2021.09.02
Django __str__  (0) 2021.08.30
Django 쿼리문 F() 사용하기  (0) 2021.08.04

+ Recent posts