기술
-
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 라이브러리에서 제공하는 단 하나뿐인 다중 필터 입니다. 하지만 이름에서..
-
Nginx 를 통해 Cloudfront 를 사용하는 방법기술 2021. 9. 24. 19:22
Django Template 으로 이루어진 내부 시스템의 일부 URL 을 React 와 REST API 로 구성된 2.0 버전으로 보이게하기위해 nginx 설정이 필요했었습니다. URL 을 포워딩 하기위한 nginx 설정 요청이 온 URL 을 다른 URL 로 변경할 수 있는 방법이 두가지 있습니다. rewrite 을 통해 URL String 을 정규식을 통해 변경할 수 있습니다. proxy_pass 를 통해 들어온 요청을 다른 곳으로 포워딩 할 수 있습니다. 추가적인 Nginx 설정 Cloudfront URL 이 도메인이므로 IP 로 변경하는데 사용하는 DNS 를 resolver 라는 예약어를 통해 지정해야합니다. 저희는 AWS 에서 nginx 설정을 사용하고 있었고, AWS 의 기본 DNS 는 172...
-
터미널에서 특정 포트를 Kill 하는 방법기술 2021. 9. 24. 19:17
터미널에서 특정 포트가 사용되고 있을 때 그 포트를 사용하는 프로그램을 꺼야할 필요가 있습니다. 저의 경우 Remote Forwarding 을 사용할 때 서버의 포트와 로컬의 포트를 SSH 로 연결해 놓는데 이 연결이 잘못되었을 때 해당 포트를 사용하고 있는 것을 꺼주어야 다음 접속 때 정상적으로 재연결됩니다. lsof 를 사용하여 열린 포트의 프로세스 번호를 가져와서 포트 사용을 없애는 방식입니다. sudo kill -9 $(sudo lsof -t -i :)
-
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..