[데이터 엔지니어링 데브코스] TIL 15일차 - 장고 활용한 API서버 만들기(5)

박단이·2023년 11월 5일
0

데브코스 TIL

목록 보기
14/56

오늘 공부한 내용🤓

  1. pop(), popitem()
    • pop(key, default)
      • 딕셔너리에서 지정된 key에 해당하는 value를 반환하고, 해당 key-value 쌍을 딕셔너리에서 제거하는 메서드
      • 만약 딕셔너리에 해당 key가 존재하지 않는다면, pop()메서드는 default 값을 반환
      • default 값이 따로 지정되어 있지 않고, 딕셔너리에 해당 key가 없을 경우에는 KeyError가 발생
    • popitem() : 딕셔너리에서 마지막으로 추가된 키-값 쌍(아이템)을 삭제하고, 삭제한 키-값 쌍을 튜플 형태(key, value)로 반환하는 메서드
  2. Related Field
    • api 내려줄 때 원하는 필드 모양으로 내려준다.
 class UserSerializer(serializers.ModelSerializer):
 	# rest api에서 question이 아이디(pk)로만 표출
	questions = serializers.PrimaryKeyRelatedField(many=True, queryset = Question.objects.all())
    # rest api에서 Question 모델에서 정의한 __str__ 형태로 나옴
	questions = serializers.StringRelatedField(many=True, read_only=True)
    # rest api에서 원하는 field를 보여줌.
	questions = serializers.SlugRelatedField(many=True, read_only=True, slug_field='question_text') 
    # rest api에서 연결된 url을 보여줌
	questions = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='question-detail') 
	
	class Meta:
		model = User
		fields = ['id', 'username', 'questions']   
  1. 투표 기능 추가 : 추가 공부 필요
  2. Validation : 추가 공부 필요
  3. Testing
    • app 폴더에 tests.py를 이용하여 유닛테스트를 진행할 수 있다.
    • test를 하고 싶은 메서드는 꼭 test_로 시작하는 이름을 가져야 한다.
    • test를 실행하고 싶다면 cmd창에서 $ python manage.py test를 실행하면 모든 tests.py 파일을 실행한다.
    • 하나의 클래스만 test 하고 싶다면 $ python manage.py test polls_api.tests.QuestionListTest => python manage.py test 앱.tests.클래스이름
    • test는 실제 db를 사용하는 것이 아니라 test용 db를 새로 만들었다가 test가 끝나면 삭제된다.
    • setUp
      • 하나의 class에서 여러개의 test를 진행할 때 모두 같은 data를 생성해서 사용한다면, setUp 메소드를 사용해서 한번만 작성한다.
      • setUp은 한번만 실행하는 것이 아니라 다른 테스트 메서드들이 실행되기 전에 항상 실행되어, 공통적으로 사용되는 객체나 데이터를 초기화한다.
    • API Test : from rest_framework.test import APITestCase을 이용해서 API test 한다.
  ## polls_api/tests.py
  from django.test import TestCase
  from polls_api.serializers import QuestionSerializer

  # test 로 시작하는 method만 test해줌
  # test가 제대로 작동하면 method마다 점(.)을 하나씩 찍어줌
  # test를 실패하면 method마다 F를 하나씩 찍어줌 + 에러난 이유에 대해 얘기함
  class QuestionSerializerTestCase(TestCase):
      def test_with_vali_data(self):
          serializer = QuestionSerializer(data={'question_text': 'abc'})
          # 2개의 인자가 같으면 True, 다르면 False
          self.assertEqual(serializer.is_valid(), True)

          new_question = serializer.save()
          # 인자가 있으면 True, 비어있으면 False
          self.assertIsNotNone(new_question.id)

      def test_with_invail_data(self):
          serializer = QuestionSerializer(data={'qusetion_text' : ''})
          # 2개의 인자가 같으면 True, 다르면 False
          self.assertEqual(serializer.is_valid(), False)
          
  1. test code를 잘 짰는지 확인
    • coverage 패키지를 설치하여 확인
      $ pip install coverage : 패키지 설치
      $ coverage run manage.py test : test code 검사
      $ coverage report : 결과 확인하기

궁금한 내용 / 어려운 내용❓

  • 전체적인 내용을 사용을 할 수 있으나 응용을 하기 위해서는 많은 공부가 더 필요할 것 같다. 용어나 메소드들이 익숙치 않아서 중구난방으로 머리속에서 흩어져 있어서 어렵다고 느껴진다.

느낀 점😊

이해했다고 명쾌하게 떨어지지 않는다. 다음주 프로젝트 동안에 이번주에 배운 내용을 응용하기 위해서 다시한번더 꼼꼼하게 복습할 필요가 있다.

profile
데이터 엔지니어를 꿈꾸는 주니어 입니다!

0개의 댓글