ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django framework 3.2 LTS 릴리즈
    2021. 4. 15. comments

    4월 6일, Django 3.2 마이너 버전이자 3.X의 LTS 버전이 릴리즈 되었다. 이번 릴리즈에는 편의 기능들이 다소 많이 포함되었는데 그 중 가장 반가운 소식은 ORM에서 AutoField에 설정에 대해서 전체 설정을 할 수 있게 됬다는 점이다. AutoField, 즉 PK가 기본값이 int이기 때문에 각 Model마다 BigAutoField로 재정의 해야하는 귀찮음(?)이 있었는데 간단한 설정으로 기본값을 변경할 수 있게 되었다.

    이번 마이너 릴리즈의 주요 변경사항은 아래 3가지이다.

    AppConfig 자동 발견

    Django에서는 하나의 프로젝트에 여러개의 앱을 운용할 수 있게 지원하고 있다. python manage.py startapp [APP_NAME] 명령으로  기본 뼈대를 만들어낼 수 있는데 그 때 apps.py 파일이 만들어지고 아래와 같이 앱 설정을 할 수 있다. 아래는 api라는 앱을 만들었을 때 AppConfig 예시이다.

    from django.apps import AppConfig
    
    class ApiAppConfig(AppConfig):
        name = 'api'

    이 때 앱의 디렉토리 위치를 변경하게 되면 Django에서는 실행시 AppConfig를 못찾게 되는 문제점이 발생한다. 이를 해결하기 위해 __init__.py에 default_app_config 변수에 config 위치를 명시해주곤 했었는데 이제는 자동적으로 config 위치를 찾는 것이 가능해졌다. 

    앱에 대한 경로를 변경하지 않는다면 유용한 내용이 아닐 수 있겠으나 점점 불어나는 앱들을 잘 관리하기 싶거나 그룹 관리하고 싶다면 위치 변경은 필수적이라서 이와 같은 설정은 개발하는데 좀 더 편의성을 가져다 주고 삽질하는 시간 또한 줄여줄 것이다. 참고로 더 이상 불필요해진 default_app_config는 곧 deprecated된다. 

    AutoField의 기본값 변경 지원

    from django.db import models
    
    class MyModel(models.Model):
        id = models.BigAutoField(primary_key=True)

    AutoField는 Django ORM에서 자동적으로 생성되는 Auto increment Primary key를 말한다. 기본값이 AutoField로 int 크기를 갖게 되는데 거의 매번 bigint 사이즈 사용을 위해 Model을 정의할 때 bigint로 정의 하기 모델마다 별도 선언을 해주었었다.

    이제는 settings.py에 DEFAULT_AUTO_FIELD 설정을 하면 전역적으로 설정이 반영된다. 이미 진행하고 있는 프로젝트에는 해당 기능을 넣기는 애매할 수 있으나 처음 시작할 때에는 해당 옵션을 포함하는 것을 추천한다. 

    DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 

     

    참고로, CLI로 startapp 명령을 내리면 apps.py에 관련 설정이 자동으로 들어가기도 한다.

    from django.apps import AppConfig
    
    
    class ApiConfig(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        name = 'api'

     

    Functional Indexes

    from django.db import models
    from django.db.models import F, Index, Value
    from django.db.models.functions import Lower, Upper
    
    
    class MyModel(models.Model):
        first_name = models.CharField(max_length=255)
        last_name = models.CharField(max_length=255)
        height = models.IntegerField()
        weight = models.IntegerField()
    
        class Meta:
            indexes = [
                Index(
                    Lower('first_name'),
                    Upper('last_name').desc(),
                    name='first_last_name_idx',
                ),
                Index(
                    F('height') / (F('weight') + Value(5)),
                    name='calc_idx',
                ),
            ]

    위 예시대로 DB의 Functional index을 Model에서 표현할 수 있게 되었다.  Lower, Upper, F, 연산자등을 활용하여 Function based 인덱스 설정이 가능하다.

    Minor 변경 내용 중 ...

    마이너 변경사항 또한 굉장히 많지만 더이상 지원하지 않는 DB 버전 내용이 있어 공유한다.

    • Dropped support for PostgreSQL 9.5
    • Dropped support for MySQL 5.6

     

    Reference

    반응형

    댓글

Designed by Tistory.