기술/Django
-
django-filters 를 사용하여 복잡한 환경에서 OrderingFilter 사용하기기술/Django 2021. 9. 24. 19:43
django-filters 를 사용한다면 OrderingFilter 를 FilterSet 쪽에 붙이는 것이 더 직관적이고 편할 수 있습니다. django-filters 라이브러리에서 OrderingFilter 에 대해 간단한 설명이 있지만 조금 더 복잡하게 사용할 필요가 있었기 때문에 어떻게 사용했는지 공유하고자 합니다. 기본 사용법 OrderingFilter 를 한 키로 정의하고 그 안에 fields 속성에 Ordering 에 사용할 필드들을 나열합니다. 위 처럼 작성하면 ?ordering=username,-first_name 와 같이 QueryString 에 포함시킬 수 있습니다. 대부분의 간단한 정렬은 가능하지만, 예외 케이스가 몇개 존재합니다. class UserFilter(FilterSet): ..
-
Django 에서 일시적으로 auto_now, auto_now_add 를 disable 시키는 법기술/Django 2021. 9. 24. 19:39
종종 엑셀에서 가끔 데이터를 마이그레이션 할 때가 있습니다. 그 때 특정 필드를 마이그레이션 데이터 값으로 채워넣어야하지만 auto_now, auto_now_add 가 설정되어 있다면 저장 시 데이터가 마이그레이션 데이터가 아니라 최신 값의 Datetime 으로 설정됩니다. 그래서 그 때마다 사용할 수 있는 문법이 필요했습니다. TemporarilyDisableAutoNowAndAutoNowAdd 주어진 모델의 save, bulk_ 메서드를 사용할 때 auto_now, auto_now_add 필드를 비활성화하는 Context Manager 를 생성하기로 했습니다. 매개변수 Model: auto_now, auto_now_add 를 비활성하고싶은 Django 의 모델을 제공합니다. field_names: 여..
-
Django Filters 에서 하나의 Key를 가지고 여러 값 필터하기 ( MultipleFilter )기술/Django 2021. 9. 24. 19:34
django-filters 에서 여러 값을 필터하는 방법으로는 몇가지 있습니다. BaseInFilter 로 key=value1,value2 같은 컴마로 구분하는 필터 MultipleChoiceFilter 로 key=value1&key=value2 같은 키로 구분하는 필터 이 중에서 같은 키로 여러 값을 구분하기 위하여 MultipleChoiceFilter 를 커스텀합니다. 하지만 MultipleChoiceFilter 는 Choice 값이 있어야만하는 에러를 발생하고, 이를 범용성 있게 하고 싶었기 때문에 다른 필터 유틸을 만들게 되었습니다. MultipleFilter MultipleChoiceFilter 가 django-filters 라이브러리에서 제공하는 단 하나뿐인 다중 필터 입니다. 하지만 이름에서..
-
Django 에서 String datetime 을 aware 한 datetime 으로 변경하는 방법기술/Django 2021. 9. 24. 19:16
REST API 를 사용하다보면 프론트에서 datetime 정보를 받을 때가 있습니다. API 로 받았기 때문에 해당 정보는 String 형태를 가지고 있습니다. 이를 Python 의 datetime 형태로 바꾸는 방법이 여럿 있겠지만 django 에서 지원해주는 util 이 있어 소개해드리고자 합니다. 시작하기 전, 사전 지식 navie vs aware naive datetime: timezone 정보를 포함하지 않는 datetime aware datetime: timezone 정보를 포함하는 datetime python 내장 datetime 를 가지고 ORM 필터를 할 때 "naive dateimte 을 aware 하게 바꿔주세요" 하며 Warning 으로 콘솔에 찍힐 때가 있습니다. DB 는 tim..
-
Django 에서 Chain 필터 시 추가적인 테이블 JOIN 방지하기 ( + _next_is_sticky )기술/Django 2021. 9. 24. 19:06
Django 에서 역관계에 있는 모델을 필터할 때 필터를 Chain 하여 사용할 경우 같은 테이블을 두고 필터하더라도 추가적으로 Join 하여 필터합니다. 이 때문에 예상과 결과가 달라질 수 있습니다. 주로 API 를 작성할 때 Django-Filters 를 사용하게 되는데 복잡한 QueryString 을 받는 경우, Chain Query 가 많이 일어나며 발생하였습니다. 간단한 샘플 모델 class Post(models.Model): pass class Comment(models.Model): post = models.ForeignKey(Post) Chain Filter 와 Chain Filter 를 하지 않은 것의 차이 Chain Filter 를 하지 않았을 때 추가적으로 Join 하지 않고 하나의 ..
-
Django Manager, Queryset기술/Django 2021. 9. 24. 18:51
Django 에서 ORM 을 깔끔하게 사용할 수 있는 공식적인 방법 두가지가 있는데 언제 어떻게 사용해야하는지에 대한 명확한 기준이 없어 고민하게 되었을 때 찾은 글입니다. Manager Django 는 Manager 를 통해 데이터베이스와 통신합니다. 응용프로그램과 데이터베이스 사이의 일종의 통신 게이트입니다. 따라서 모든 장고의 모델은 하나 이상의 Manager 가 존재합니다. Custom Manager 를 언제 사용하나요? 1. 초기 Queryset 을 수정하기 위한 목적 만약 Manager 에 따라 삭제된 것을 포함/미포함하여 가져오고 싶을 때, Manager 를 사용하여 첫 Queryset 에서 필터해서 가져오게 할 수 있습니다. from django.db import models class P..
-
Django 에서 Annotate 와 Union 을 함께 사용할 때 생기는 문제기술/Django 2021. 9. 24. 18:32
Django 에서 annotate 로 추가한 필드와 기존 필드들을 Union 후 같이 사용할 때 몇가지 이상한 동작이 있습니다. 똑같은 컬럼을 annotate 했지만 컬럼의 결과에 다른 컬럼의 값이 들어있는 문제가 발생했습니다. 파란색 네모가 status 값인데 일부가 address 에 존재하고 빨간색 네모가 address 값인데 일부가 status 에 존재했습니다. 동작하지만 원하는 결과가 나오지 않는 코드 Python 코드 가맹점쿼리 = 가맹점.objects.annotate( address=F('addr'), ).values( 'pk', 'status', 'address', 'name', ) 협력사쿼리 = 협력사.objects.annotate( status=Value(None, output_field..
-
Django 에서 Generic ForeignKey 를 사용을 권장하지 않는 이유기술/Django 2021. 9. 24. 18:25
다형성을 효율적으로 구현하기 위한 설계로 GenericForeignKey 를 찾게됩니다. 하지만 GenericForeignKey 를 사용하지 않아야할 이유와 대안에 대해서 이야기드리고자 합니다. GenericForeignKey 란? 한 특정 모델과 ForeignKey 를 연결해주는 것이 아니라 모든 모델과 범용적으로 ForeignKey 를 연결해주는 것이 GFK(GenericForeignKey) 입니다. 즉, ForeginKey 를 어떤 모델에나 연결하고싶다는 이야기입니다. 구현 방식 Django 에는 ContentType 이라는 모델이 있습니다. 이 모델은 DB 에 생성된 각 모델들의 정보를 가지고 있으며, 이 정보를 이용하여 여러 모델과 연결고리를 만들어 주는 것입니다. 세 필드를 가지고 Generi..