Python/Django(23)
-
[Django] 특정 리스트에 순서에 맞게 order_by(id 순서대로 정렬)
이슈 상황 데이터베이스 쿼리는 반드시 사용자가 제공한 순서대로 가 아니라 데이터베이스에서 찾은 순서대로 개체를 반환한다. 조건으로 넣은 리스트 순서에 따라서 조회가 되게 하려면, 특정 리스트에 순서에 맞게 order_by를 하는 작업이 필요하다. 예시 id 리스트 [1, 3, 2]를 넣으면 [object(1), object(3), object(2)] 순서로 조회가 되게 하는 경우이다. Example code id_list의 1, 3, 2 순서대로 order_by를 진행 id_list = [1, 3, 2] objects = Model.objects.filter(id__in=id_list).order_by( Case(*[When(id=id, then=pos) for pos, id in enumerate(id..
2023.10.10 -
Versioning decorator
설명 Django Versioning을 하기 위한 방법 중 하나로 Decorator를 만들어 Versioning하는 방법을 정리했습니다. 목차 Django Versioning https://www.django-rest-framework.org/api-guide/versioning/ Versioning - Django REST framework www.django-rest-framework.org Versioning Decorator 장점 API 구현 시 Depth 가 줄어든다. 유지보수가 편해진다 아래 예시는 Serializer 만 변경되지만, 변경 부분이 다수 존재하는 경우 유지보수가 어려워짐 명확한 version 관리 가능 API 에 대해서 Version을 진행했을 때 버전별 API를 명확히 확인 가..
2023.08.21 -
[Django] SerializerMethodField
글 내용 SerializerMethodField 사용 시 N+1 문제가 발생할 수 있는 상황에 대한 정리 SerializerMethodField의 장점 모델에 없는 데이터 정의 후 사용 유연성 및 데이터 정의 동적으로 필드 구현 등등 위와 같은 장점이 있지만 주의점이 존재 N+1 상황 아래와 같은 방식으로 작성 시에 team에 대해서 Prefetch가 되어 있어도 N+1문제가 발생 Prefetch User.objects.prefetch_related( Prefetch( 'consultings' queryset=Consulting.objects.filter(status=1) ) ) Serializer class UseSerializer(ModelSerializer): consulting_list = Ser..
2023.06.19 -
Django PhoneNumberField, phonenumbers
Django에서 휴대전화 번호를 저장하는 field를 구성하는 방법은 2가지가 있다. RegexValidator을 이용해 정규식 적용 PhoneNumberField 사용 https://github.com/stefanfoulis/django-phonenumber-field RegexValidator을 이용해 정규식 적용 phone_number = models.CharField( max_length=16, blank=True, null=True, validators=[ RegexValidator( regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format '+123456789'. Up to 15 digits allowed." )..
2023.04.26 -
Django Custom Header 처리
설명 해당 문서는 Django에서 custom header를 다루기 위한 방법을 작성했습니다. 1. 요청 시 Header 형식 파스칼 케이스에서 - 를 추가한 형식으로 명명 예시 CustomHeader 라는 헤더를 추가 시: Custom-Header 2. 접근 시 Header 형식 HTTP_{your uppercased header name} 형식으로 접근 예시 Meta에서 CustomHeader 라는 헤더 조회 시: HTTP_CUSTOEM_HEADER 3. Header Permmssion 예시 class CustomHeaderPermission(BasePermission): def has_permission(self, request, view): secret_key = request.META.get('..
2023.03.08 -
Django group by 이슈
이슈사항Django는 values를 통한 group by를 해야한다. 그 와중에 annotate와 values의 순서가 중요하다. 예시아래와 같이 values 후에 annotate가 존재해야 group by 가 정상동작하는 걸 볼 수있다.Model.objects.annotate( max_value=Max(value)).values( 'group_by_value').annotate( count=Count('*') # values 아래 annotate가 있어야 group by 동작) 참고https://docs.djangoproject.com/en/4.1/topics/db/aggregation/
2023.02.11 -
[Django] order_by 시 group by 제거 방법
에러 상황 values를 통한 group by 진행 후 query는 정상적으로 동작 함. 하지만, order_by('pk') 시 group by에 pk가 추가 되어 group by 의미가 상실하는 이슈 발생 해결방법 extra를 통한order by order_by를 다른 방법으로 대체 group by로 pk 리스팅 후 sorting을 통해 재조회로 처리(query 호출이 2건이 되는 단점..)
2023.02.11 -
Pandas 엑셀 다운 시 인코딩 깨짐(utf-8, utf-8-sig)
에러 상황 엑셀 파일 생성 후 다운로드 시 한글이 깨지는 현상 발생(utf-8 형식은 동일) BOM(Byte Order Mark) 문제 https://stackoverflow.com/questions/17879198/adding-utf-8-bom-to-string-blob 해결 방법 utf-8-sig을 사용하여 encoding df.to_excel(file_path, index=False, columns=columns, header=headers, encoding='utf-8-sig') sig(signature)으로 인해 UTF-8 파일을 읽을때 BOM을 따로 처리하고 텍스트 내용과 분리하여 처리된다. 참고 https://stackoverflow.com/questions/57152985/what-is-t..
2022.11.30