Django
Django Filterset 활용하기
Django에서는 Search 기능이나 Filter 기능을 제공해 준다. 여기서 다양한 lookup을 사용할 수 있다. queryset과 거의 유사하게 제공해 주기 때문에 기능을 구현하는 게 직관적으로 쉬웠다. 나는 exclude를 구현하고 싶었다. 코드는 다음과 같다. views.py: from django_filters.rest_framework import DjangoFilterBackend class FooView(viewsets.ReadOnlyModelViewSet): filter_backends = [..., DjangoFilterBackend, ...] filterset_class = PlantFilter # legacy 에선 filter_class 로 되어있어서 간혹 stackoverflo..
Django staticfile 관리하기
프로덕션에서 정적파일 제공하기 정적 파일을 프로덕션에 넣는 기본 개요는 정적 파일이 변경될 때 collectstatic 명령을 실행 한 다음 수집 된 정적 파일 디렉터리(STATIC_ROOT)를 정적 파일 서버로 이동하여 제공하도록 정렬하는 두 단계를 구성한다. STATICFILES_STORAGE에 따라 파일을 수동으로 새 위치로 이동하거나, Storage 클래스의 post_process 메서드가 처리할 수 있다. 모든 배치 작업과 마찬가지로 daemon 세부 사항이 있다. 모든 프로덕션 설정은 약간 다르다. 아래에서 소개하는 것은 일반적인 패턴이다. 같은 서버에서 정적파일과 사이트를 제공하기 사이트에 이미 서비스를 제공하고 있는 서버와 동일한 서버에서 정적 파일을 제공하려는 경우 프로세스는 다음과 같을..
[DRF] Serializer relations
Model 간의 관계를 Serializer를 통해 표현하려면 어떻게 해야 할까? 한 번 알아보자. 데이터 간의 관계는 OneToOne, ForeignKey, ManyToMany 등 다양하다. 이를 Serializer에서 표현하려면 어떻게 할까? NOTE! DRF에서는 쿼리 최적화까진 해주지 않는다. 이는 프로그래머의 몫이므로 쿼리 최적화를 하자. API Reference 앨범과 트랙 모델을 통해 자세히 살펴보자 class Album(models.Model): album_name = models.CharField(max_length=100) artist = models.CharField(max_length=100) class Track(models.Model): album = models.ForeignKe..
[DRF] create vs perform_create
create와 perform_create는 Django REST Framework에서 사용되는 두 개의 메소드이다. create 메소드는 API 뷰에서 POST 요청을 받을 때, 새로운 객체를 생성하는 메소드이다. 이 메소드는 일반적으로 API Serializer 클래스의 save() 메소드를 호출하고, 데이터 유효성 검사를 수행하여 새로운 객체를 생성한다. 그리고 생성된 객체를 HTTP response로 반환한다. def create(self, validated_data): email = validated_data.get("email", None) validated.pop("email") # Now you have a clean valid email string # You might want to ca..
[DRF] APIView vs ViewSet
DRF는 RESTful API를 만들기 위한 뷰를 정의하는 CBV 형태의 두 가지 방법이 있다. APIView와 ViewSet이다. 두 가지의 특징과 차이점을 살펴보자 APIView APIView는 커스텀하기 편한 기본 클래스이다. API View를 사용하면 각 HTTP 메서드(GET, POST, PUT, DELETE 등)를 별도로 정의하고 요청/응답을 수동으로 처리해야 한다. API View를 사용하면 API 로직과 응답 생성을 완벽하게 제어할 수 있지만 더 많은 상용 코드가 필요하다. from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import authentic..
Django 구조 잡기
django 프로젝트 구조에 대한 고민을 하고 있었는데 통찰을 얻을 수 있는 글이 있었다. https://soheeeep.tistory.com/m/26 [Django] 프로젝트 구조 잡기 장고는 하나의 프로젝트 내에 여러 개의 app이 존재하는 구조이다. python manage.py startapp [appname] 명령으로 app을 생성한 뒤, settings의 INSTALLED_APPS에 생성된 app을 등록해줌으로서 손쉽게 관리할 수 있 soheeeep.tistory.com 이걸 보고 구조에 대한 고민을 좀 더 해봐야겠다.
[DRF] SearchFilter
회사에서 검색과 필터 기능을 구현해야 한다. 그전에 앞서 복기를 해보자. DRF에서는 FIlter기능과 SearchFilter를 제공해 준다. 우선은 SearchFilter만 구현해 보자 SearchFilter SearchFilter 클래스는 단순한 단일 쿼리 매개 변수 기반 검색을 지원하며, 장고 관리자의 검색 기능을 기반으로 한다. 사용 중인 브라우저 API에는 SearchFilter 컨트롤이 포함된다. search_fields 특성이 설정된 경우에만 SearchFilter 클래스가 적용된다. search_fields 특성은 CharField 또는 TextField와 같은 모델의 텍스트 유형 필드 이름 목록이어야 한다. from rest_framework import filters class User..
[QuerySet] Q() Objects 알아보기
장고에서 OR 연산을 가능하게 하는 Q() Objects를 알아보자. 당연히 이 포스팅도 공식 문서를 참고했다. Complex lookups with Q objects 키워드 인수 쿼리(filter() 등)와 함께 사용한다. 더 복잡한 쿼리 예를 들면 OR 문이 있는 쿼리를 실행해야 하는 경우 Q 개체를 사용할 수 있다. Q 객체(django.db.models.Q)는 키워드 인수 모음을 캡슐화하는 데 사용된다. 이러한 키워드 인수는 "필드 조회"에서와 같이 지정한다. 예를 들어, 아래와 같은 Q 객체는 단일 LIKE 쿼리를 캡슐화한다. from django.db.models import Q Q(question__startswith='What') Q 갹채는 &, |, 및 ^ 연산자를 사용하여 결합할 수 있..
[QuerySet] Built-in Expressions - F() 표현식 알아보기
이 포스팅은 장고 공식 문서를 기반으로 했습니다. F() expressions F() 객체는 모델 필드의 값, 모델 필드의 변환된 값 또는 annotated 된 열을 나타낸다. 실제로 DB에서 Python 메모리로 꺼낼 필요 없이 모델 필드 값을 참조(성능의 효율성)하고 이를 사용하여 DB 작업을 수행할 수 있다. Django는 F() 객체를 사용하여 DB 수준에서 필요한 작업을 설명하는 SQL식을 생성한다. 일반적으로 다음과 같은 일을 할 수 있다. # Tintin filed a news story! reporter = Reporters.objects.get(name='Tintin') reporter.stories_filed += 1 reporter.save() 여기서 우리는 DB에서 reporter...
[Queryset] select_related와 prefetch_related 살펴보기
select_related와 prefetch_related를 사용하는 이유는 ORM에서 발생되는 N+1 문제를 해결하기 위해 eager-loading(즉시 호출) 방식을 취하는 두 가지 메서드 사용한다. N+1 문제란? Lazy-loading 방식은 실제 데이터를 사용할 때 DB에 히트하게 된다. 이로 인해 참조 관계의 데이터를 가져올 때 문제가 발생한다. 처음 1번의 SQL query를 실행할 때 해당 모델이 갖고 있는 필드만을 가져온다. 순회 시 참조 모델의 데이터는 처음 쿼리에서 가져오지 않았기 때문에 순회 횟수(N번)만큼 참조 관계 모델의 SQL query를 실행한다. 꼭 1번 더 쿼리를 실행하는 것은 아니고 비효율적으로 쿼리 호출 횟수가 생긴다는 의미로 받아들이면 된다. 자세한 내용은 1. 블로..