분류 전체보기
-
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..