Django Rest API(2)

‍박소연·2022년 8월 26일
0

Django

목록 보기
3/10

Django Rest API생성(Post)

api.py
class StudentList(APIView):
    def get(self, request):
        model = Student.objects.all()
        serializer = StudentSerializer(model, many=True)

        return Response(serializer.data)

   def post(self, request):
     serializer = StudentSerializer(data=request.data)

     if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status = status.HTTP_201_CREATED)

     return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)
 
 

Django Rest API 업데이트(Put)

전체말고 하나하나 정보를 뜯어보고 싶다면??

api.py
class StudentDetail(APIView):

    def get(self, request, student_id):
        model = Student.objects.get(student_id=student_id)
        serializer = StudentSerializer(model)

        return Response(serializer.data)
    

get과 filter의 차이

Model.objects.filter

새로운 쿼리셋(객체 여러개)을 생성 후, 필터 조건에 부합하는 여러 개를 묶어서 리턴하기 때문에 for문을 순회하며 각각의 필드에 접근해야 한다.

Model.objects.get

ORM에서 해당하는 조건들만 담은 모델 객체 하나를 가지고 있어, for문을 순회할 필요가 없다. 특정 한개만 검색할 경우(id와 같이 고유한 값)에 사용하는 것이 좋다.
값이 없거나 여ꁰ 개일 때 error!

참고: https://dev-mht.tistory.com/63

urls.py
path('api/student_list/<int:student_id>', StudentDetail.as_view(), name='student_list')

업데이트 해보자!

api.py
class StudentDetail(APIView):
    def get(self, request, student_id):
        model = Student.objects.get(student_id=student_id)
        serializer = StudentSerializer(model)

        return Response(serializer.data)

   def put(self, request, student_id):
        model = Student.objects.get(student_id=student_id)
        serializer = StudentSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status = status.HTTP_201_CREATED)
        return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)
        
        

student_id값 딱 하나만으로 찾아서 그에 해당하는 데이터들만 뽑아와서 수정해줌

그런데, 지금 상태에서는 age 하나만 수정하려고 하면 다른 값들을 입력해주지 않았다고 에러가 난다!!

값 하나만 수정하려고 했을 때도 에러가 나지 않게 변경해보자

serializers.py
class StudentSerializer(serializers.ModelSerializer):
    student_id = serializers.CharField(required=False)
    name = serializers.CharField(required=False)
    age = serializers.CharField(required=False)

    class Meta:
        model = Student
        fields = '__all__'
    
    
    

Django Rest API Delete(삭제)

api.py의 class StudentDetail

def delete(self, request, student_id):
    model = Student.objects.get(student_id=student_id)
    model.delete()

    return Response(status=status.HTTP_204_NO_CONTENT)

0개의 댓글