django 11

Django nested Serializer update 시 선언되지 않은 field 문제

1. 문제점 부모 - 자식의 구조를 갖는 Nested된 Serializer 구조를 사용했는데, update 메서드를 Django에서 지원하지 않는다고 하면서 아래 같은 에러 메시지가 뜬다. AssertionError: The `.update()` method does not support writable nested fields by default. Write an explicit `.update()` method for serializer `...`, or set `read_only=True` on nested serializer fields. 2. 해결 방안 필드를 사용할 때 반드시 Model에서 역참조로 related_name 값으로 정의한 이름으로 사용해주어야 한다. School : People ..

reverse relationship: _set 호출 시 get_ 메서드에서 N+1 발생

문제 reverse relationship을 가진 속성값을 _set을 통해서 호출할 때, get_ 메서드에서 N+1 문제가 발생했다. 해결 예를 들면 아래 예시 코드에서, student_set을 통해 Related Manager로 set을 불러올 때 .all()을 사용하면 안되고 .first()등으로 특정 로우를 한정해야한다. 그렇지 않으면 여러 개의 School -> 여러 개의 Student가 호출되면서 N+1 문제가 필연적으로 발생한다. class SchoolListSerializer(serializers.ModelSerializer): latest_student_name = serializers.SerializerMethodField() def get_latest_student_name(self, ..

[TIL] insert시 ForeignKey에 제한 걸기: DB Trigger 사용

Django - python - postgresql을 이용하여 작업을 진행하던 중, 발생했던 문제점을 해결한 기록이다. 문제상황 아래처럼 새로운 테이블(모델)을 생성하고자 했다. class IWantNewModel: old_model = ForeignKey( "models.OldModel", on_delete=CASCADE, ... ) 이 때, FK가 되는 old_model의 타입을 특정 타입이 되도록 제한하고 싶었다. DB 자체에서 제한을 걸면 나중에 서비스단 로직에서 굳이 validation을 복잡하게 할 필요가 없기 때문이다. 한층 더 추상화되는 점은 있다만, 그래도 편리할 수 있다. Django에서는 이런 경우(FK가 아닌 경우에는) CheckConstraint 조건을 주어서 DB에서 제한을 걸도..

[TIL] Django Restframework Exception Handler 개요

1. Exception Handler 설정 Django에서 exception handler는 settings.py 파일의 RESTFRAMEWORK 설정에서 경로를 지정해줄 수 있다. 기본적으로는 Class를 지정하여 사용하며 exception_handler.ExceptionHandler를 상속받아 메서드들을 override한다. from rest_framework.views import exception_handler class CustomExceptionHandler(exception_handler.ExceptionHandler): def handle_exception(self, exc): # Custom logic to handle the exception # Return a custom respon..

[TIL] FloatField, DecimalField 차이점 / 위경도 표시 소수점과 거리값

Django의 Serializer에서 정의하는, 소수점 값을 사용할 수 있는 필드는 FloatField와 DecimalField가 있다. 결론적으로는 아래 참조에 나와있듯이 해당 필드를 이용해서 계산이 필요한 경우는 DecimalField를 사용하는 것이 좋다. DecimalField - str 기반이다. '126.123541231'로 표시된다. coerce_to_string = False로 옵션을 적용하면 decimal 타입으로 표시할 수 있다. - max_length, decimal_places 옵션을 통해 최대 길이와 소수점 자리수를 지정할 수 있다. 기타 상세한 내용은 참조 링크 ref) 스택오버플로우 https://stackoverflow.com/questions/2569015/django-fl..

[TIL] Django ORM values, annotate, Subquery, OuterRef, JSONField, Type Cast 부분 적용

자세한 내용은 Django 공식 문서에 있다. 여기서는 기존 다른 SQL에서 자주 사용하는 기능들을 한 눈에 대략적으로 파악할 수 있도록만 정리한다. Django 공식 문서 - Queryset https://docs.djangoproject.com/en/4.1/ref/models/querysets/ 코드 User.objects .annotate( user_name=F("name"), comment_file_path=Subquery( Comment.objects.annotate(file_path=F("data__file_path")) .values("data__file_path") .filter(user=OuterRef("pk"))[:1] ), ) .values("user_name", "comment_fi..

[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] Django bulk_update 방법과 주의사항

Django bulk update는 인자값으로 fields를 주어야한다. 모델의 어떤 필드를 업데이트할 것인지 직접 지정해줘야하는 것이다. 아래 코드에서 some_models =[] 에는 필드값이 업데이트된 Some_Model의 QuerySet 객체가 들어있다고 보면 된다. Some_Model.objects.bulk_update( some_models, batch_size=3000, fields=["status", "result"], ) 자바-스프링 계열은 JPA가 dirty checking을 알아서 해줬었는데.. 아쉽다 ㅠㅠ bulk_create, bulk_insert 시 주의할점 serializer에서 제공하는 validate가 먹히지 않을 수 있기 때문에 def validate_xxx 로 입력값에 ..

[TIL] django, postgresql에서 json column 내부값(key값) 조회하기

anti-pattern일 수 있지만, 아래처럼 많은 양의 데이터를 우선적으로 column 하나에 json으로 넣어야할 수 있다. 이런 경우 내부 값을 조회하는 postgresql의 문법을 위 예시에 적용하면 다음과 같다. select table.data -> 'length', table.data -> 'size', ... https://popsql.com/learn-sql/postgresql/how-to-query-a-json-column-in-postgresql Django에서도 더블 언더 스코어(__) 문법으로 이를 지원한다. def get_queryset(self): return ( self. queryset .filter( table__data__length__isnull=True, )

[TIL]Django Swagger 표현을 위한 라이브러리 : drf-spectacular(drf-yasg), OpenAPI

좀 더 자세한 이야기는 다음 연결 글을 참고! OpenAPI 명세, Swagger 기본 개념 : Django restframework, drf-spectacular로 swagger split 1. open api와 swagger, redoc의 개념 OpenAPI는 OpenAPI Specification (OAS)이라고도 불리는데, REST API의 스펙을 규칙에 맞게 json이나 yaml로 표현한 문서를 말한다. Django 에서는 일반적으로 프로젝트에 Schema.yml 이나 Schema.json 파일로 프로젝트의 API 구조를 뼈대처럼 작성해놓는다. 물론 자동으로... 예시) schema.yml 파일의 일부 Swagger나 redoc은 이런 Schema.yml 파일을 기반으로 각 API들의 입출력 구..