본문 바로가기

프로그래밍/Django개발(MAC OS)

Django restframework 6. Create

반응형

2021.04.03 - [프로그래밍/Django개발(MAC OS)] - [Django Rest Framework] 시작하기 Rest API 소개

2021.04.24 - [프로그래밍/Django개발(MAC OS)] - Django restframework 2. 설치하기

2021.04.24 - [프로그래밍/Django개발(MAC OS)] - Django restframework 3. APIView

2021.04.24 - [프로그래밍/Django개발(MAC OS)] - Django restframework 4. ListAPIView

2021.04.24 - [프로그래밍/Django개발(MAC OS)] - Django restframework 5. RetrieveAPIView




전체 리스트와 한 개의 방을 읽어오는 방법은 알아보았는데요.

 

이번에는 Create로 DB에 데이터를 저장하는 것을 알아보도록 하겠습니다.

 

 

1. 우선 DRF 방식으로 작업하는 방법인데요.

 

이런 방식을 사용하는 이유는 편리한 방법을 하용하기에 앞서 어떻게 동작하는지 이해할 필요가 있어서 그렇습니다.

 

 

 Views.py

from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status

@api_view(["GET","POST"])
def rooms_view(request):
    if request.method == "POST":
        serializer = WriteRoomSerializer(data=request.data)
        if serializer.is_valid():
            room = serializer.save(user=request.user)
            room_serializer = ReadRoomSerializer(room).data
            return Response(data=room_serializer, status=status.HTTP_200_OK)
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)
            
        return Response()

 

Serializers.py

class WriteRoomSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=140)
    address = serializers.CharField(max_length=140)
    price = serializers.IntegerField()
    beds = serializers.IntegerField(default=1)
    lat = serializers.DecimalField(max_digits=10, decimal_places=6)
    lng = serializers.DecimalField(max_digits=10, decimal_places=6)
    bedrooms = serializers.IntegerField(default=1)
    bathrooms = serializers.IntegerField(default=1)
    check_in = serializers.TimeField(default="00:00:00")
    check_out = serializers.TimeField(default="00:00:00")
    instant_book = serializers.BooleanField(default=False)

    def create(self, validate_data):
        print(validate_data)
        return Room.objects.create(**validate_data)

 


위 코드 설명


 

1. POST 방식으로 데이터를 전송한다.

 - (이때, 데이터는 Dict Type의 데이터) JSON

 

2. Serializer 호출(데이터 전달)

 - Serializer를 통해서 데이터를 전달

serializer = WriteRoomSerializer(data=request.data)

* 여기서 Serializer에 (date=request.data)로 가는 것들은 추후에 create 함수에 (validate_data)에 모두 들어간다.

 

3. 데이터 검증

  - 데이터가 잘 들어왔는지 is_valid()함수를 사용해서 데이터를 검증

if serializer.is_valid():

 

4. 데이터 검증

  - 데이터가 잘 들어왔는지 is_valid()함수를 사용해서 데이터를 검증.

 

5. Save()함수 호출

 - 이때, svae()함수는 요청이 Create인지, Update인지 확인이 가능하기 때문에, Create()함수를 바로 호출하는 건 X

  반드시, save()함수를 호출해서 인스턴스를 리턴받아야만 한다.

 - 그냥 Save()함수를 사용하자!

room = serializer.save(user=request.user)

 - 이때, 만약에 Create를 할 때, User에 대한 정보를 넣어줘야 한다면, 다음과 같이 user정보는 request.user로 데이터를 가져와야됨.

 

 

6.  DB 추가

 - Serializer.py에 def create()함수를 오버라이딩 해서 사용한다.

 - Room.objects.create()함수를 사용하면, DB에 저장을하고 인스턴스가 생성된다. 이걸 Return해준것.

 - **validate_data 앞에 **을 넣은 건, 들어온 데이터를 언패킹한다고 보면될듯.

    def create(self, validate_data):
        print(validate_data)
        return Room.objects.create(**validate_data)

 

 

7. 테스트

  - 이제 테스트를 해보면 잘 들어간것을 확인 할 수 있습니다.

 

 

그러면 생각보다 쉽다.

반응형