본문 바로가기
관리자

Programming-[Backend]/Django

(56)
[TIL] Django created_by, modified_by 적용하기 : django crum, settings.AUTH_USER_MODEL 등 1. 기본원리 기본원리는 threading → Local로 개별 쓰레드가 user를 물고와서 Middleware를 통해 Model를 업데이트 해주는 방식 https://solutionschecker.com/questions/django-populate-user-id-when-saving-a-model/ 2. Django Crum library Django crum에서 get_current_user()를 처리하기 전에, 앞선 미들웨어인 AuthenticationMiddleWare에서 Request.user를 불러오는데, 여기서 get_user() 메서드 쪽을 보면 세팅에서 지정한 User를 참고하여 불러오는 것을 확인할 수 있다. 이렇게 구해진 user 정보가 django crum의 middleware로 ..
[TIL] Django ModelSerializer의 field, validate()의 data ModelSerializer의 field 구분 어떤 Serializer가 ModelSerializer를 상속받도록 만들었다면, Meta 라는 class를 만들고 그 내부에 field 값들을 적게 된다. 그리고 상위에 custom 필드, read_only_fields를 아래와 같은 방식으로 작성한다. class CustomeSerializer( serializers.ModelSerializer, ): desc = serializers.CharField(write_only=True) color = serializers.CharField( label="색깔", help_text="`#FFFFFF` 형태의 정확한 HEX 값을 입력해주세요.", required=False ) class Meta: model = C..
[TIL] 파이썬 리턴타입 힌트로 속성 탐색, unittest.mock의 @patch 파이썬 리턴타입 힌트로 속성 탐색 아래와 같이 리턴 타입(Snapshot)을 지정하면, 해당 get_snapshot() 메서드를 불러와서 리턴타입으로 사용할 때 속성 탐색이 가능해진다.(아래 사진) def get_snapshot(self) -> Snapshot: return self.context.get("view").get_snapshot() unittest.mock의 @patch unittest.mock의 @patch로 특정 {패키지…메서드}를 무시하고 리턴값을 지정할 수 있다. @patch( "utils.api_processor.start_process", return_value=[200, ""] ) 위 코드는 utils.api_processor 패키지의 start_process 메서드의 실행을 무..
[TIL] get_serializer()와 serializer.save()의 instance, get_object_or_404 get_serializer()와 serializer.save()의 instance get_serializer() 에 들어가는 instance는 serializer의 update() 메서드를 불러오고 updata할 대상을 가리키게 된다. serializer.save()로 넘기는 정보는 클라이언트에서 넘어온 정보가 아니라 서버 측에서 추가로 넘기는 정보이다. 따라서 get_serializer()로 넘기는 정보는 검증 과정을 거쳐서(검증 메서드 통과 후) validated_data에 들어가지만, save()에 넘기는 추가 인자들은 클라이언트에서 넘어온 정보가 아니므로 검증을 거치지 않는다. 다만 똑같이 validated_data에 추가된다. 검증을 거치지 않은 추가적인 정보도 validated_data에 포함..
[작성중]Django REST framework 공식문서: 3. Serializer - ModelSerializer ModelSerializer modelSerializer는 Model에서 정의한 각 필드를 자동으로 추가해준다. Serializer 사용시 : 필드를 하나씩 정의 class CommentSerializer(serializers.Serializer): user = UserSerializer(required=False) edits = EditItemSerializer(many=True) # A nested list of 'edit' items. content = serializers.CharField(max_length=200) created = serializers.DateTimeField() ModelSerializer 사용 시 : 각 필드를 정의하는 내용을 Model(Comment)에서 정의한 것과 똑..
Django REST framework 공식문서: 2. Serializer - Validation과 Data 접근 DRF 공식문서 스터디 기록. 일반적이고 기본적인 내용은 생략하고, 새롭게 배운 내용과 실무에서 쓰일만한 내용 위주로 공부한다. DRF 공식문서의 API Guide 부분을 참고했다. https://www.django-rest-framework.org/ 1. Validation Validation에 대한 자세한 내용은 다음에 Validator 내용을 작성하는 곳에서 다룰 예정이다. 여기서는 Serializer를 사용할 때 필수적으로 알아야할 Validation의 기본적인 사항에 대해서만 공부한다. validated_data에 접근하거나, 어떤 instance를 save하기 전에 반드시 is_valid()를 호출해야 한다. 즉 아래와 같은 방식으로 사용해야한다. serializer = CommentSeria..
[TIL] django 테스트 - subTest 활용하기, 인스턴스 field update 하기 subTest 활용하기 테스트 시에 subTest를 활용하면 논리적으로 구분되어 읽기 좋고, 어떤 부분에서 에러가 났는지 명확히 알 수 있다. 나는 아래와 같이 논리적 구분을 위해 사용했다. def test_update(self): ###...중략 ### django model bakery로 초기 데이터(fixture) 생성 # then with self.subTest("200 정상 확인"): self.assertEqual( response.status_code, status.HTTP_200_OK, ) with self.subTest( "입력값으로 받은 name이 post에 업데이트 된다" ): post.refresh_from_db() post2.refresh_from_db() self.assertIsN..
Django REST framework 공식문서: 1. Serializer - view와 serializer관계, 전달 정보 : Data, create/update, save DRF 공식문서 스터디 기록. 일반적이고 기본적인 내용은 생략하고, 새롭게 배운 내용과 실무에서 쓰일만한 내용 위주로 공부한다. DRF 공식문서의 API Guide 부분을 참고했다. https://www.django-rest-framework.org/ Serializer의 역할 Serialize를 한다는 것은 일반적으로는 특정 언어에서 사용하는 객체를 바이트 또는 스트림으로 변환한다는 것이다. Django 에서는 Django가 다룰 수 있는 객체를 외부에서 받는 JSON 등의 데이터 형태로 변환한다는 것을 의미한다. Deserialize는 그와 반대 개념이다. 요청 JSON 등의 데이터 -> Deserialize -> Django 객체(DB 저장)-> Serialize -> 응답 JSON 등의 데이터 ..