Django 3.2 릴리스와 주요 변경 사항

이 글에서는 Django 3.2에 추가된 기능과 바뀐 점을 알아보려 합니다. Django 3.2 release notes를 참고하였습니다.

Django는 3년 마다 LTS를 위해 메이저 버전을 하나씩 올리고, 8개월마다 마이너 버전을 올립니다. 이번에 출시한 3.2는 3년간 지원되는 LTS 업데이트입니다.

Django 릴리스 사이클, 출처: https://www.djangoproject.com/

파이썬 호환성

Django 3.2는 파이썬 3.6, 3.7, 3.8, 3.9를 지원합니다.

44BITS 소식과 클라우드 뉴스를 전해드립니다. 지금 5,000명 이상의 구독자와 함께 하고 있습니다 📮

새 기능

함수형 인덱스(functional index)

함수형 인덱스를 생성할 수 있는 표현식을 지원합니다. 다음과 같이 인덱스를 생성했다고 가정합시다.

class Person(models.Model):
    ...
    class Meta:
        indexes = [
            Index(Lower('name').desc(), 'birthday', name='name_and_birthday_idx')
        ]

앞의 코드는 이름의 역순과 생일순 조합으로 정렬된 인덱스를 생성합니다.

pymemcache 지원

캐시 백엔드에 pymemcache를 지원합니다.

관리자 도구에서 사용할 수 있는 display 데코레이터

사용자 정의 필드에 속성을 부여하다보면 조금 지저분해보이던 코드를 display 데코레이터로 해결할 수 있습니다.

def was_born(self, obj):
    return obj.birthday is not None
was_born.boolean = True
was_born.admin_order_field = '-birthday'
was_born.short_description = 'Was Born?'

앞의 코드를 다음처럼 수정하면 됩니다.

@admin.display(
    boolean=True,
    ordering='-birthday',
    description='Was Born?',
)
def was_born(self, obj):
    return obj.birthday is not None

자잘한 변경

# alias를 filter에 사용할 수 있습니다.
people = Person.objects.alias(kids=Count('kids')).filter(kids__gt=2)

# aggregate에서 사용하려면 annotate을 거쳐야 합니다.
Person.objects.alias(kids=Count('kids')).annotate(kids=F('kids')).aggregate(Sum('kids'))
# 태어난 해에 죽은 사람을 필터링합니다
Person.objects.filter(birtyday__year=F('deathday__year'))

# 가장 최근에 죽은 사람의 년도를 찾습니다
Person.objects.aggregate(last_dead_year=Max('deathday__year'))
Person.objects.create(name='Raccoony', num_of_articles=2)
person = Person.objects.annotate(json_object=JSONObject(
    name=Lower('name'),
    num_of_articles=F('num_of_articles') * 10
)).get()
person.json_object  # {'name': 'raccoony', 'num_of_articles': 20}
response = HttpResponse(headers={'Age': 120})

# 다음 두 행은 결과가 같습니다.
response.headers['Age'] = 120
response['Age'] = 120
float_value = 12345.67000

# {{ value|floatformat:"2g" }}  -> 12,345.67
# {{ value|floatformat:"5g" }}  -> 12,345.67000
# {{ value|floatformat:"g" }}   -> 12,345.7
# {{ value|floatformat:"-3g" }} -> 12,345.67
# {{ value|floatformat:"-5g" }} -> 12,345.67

중단 예정인 기능(화살표 뒤의 기능을 사용하길 권합니다)

마치며

요약은 여기까지입니다. 개인적으론 중요하지 않아 보여서 적지 않은 내용이 여러분에겐 더 중요할 수도 있으니, Django 3.2 공식 릴리스 노트를 한 번 살펴보시길 추천합니다.

아마존 S3(Amazon S3), path 형식의 API 호출 중지 예정

🗞 새소식, 2019-05-08 - 아마존 S3에서는 현재 경로 형식과 가상 호스트 형식 두 가지 방식의 객체 지정이 가능합니다. 2020년 9월 30일부터 AWS의 S3에 대한 경로 형식의 API 요청이 동작하지 않도록 변경됩니다. 이에 따라 AWS에서는 최신 SDK를 사용하고 경로 형식을 사용하는 코드를 변경하도록 권장하였습니다.

코모도 CA(Comodo)의 AddTrust External 루트 인증서 만료

🗞 새소식, 2020-06-01 - 한국 시간 5월 30일 오후 7시 48분을 기해 코모도(Comodo) 사의 루트 인증서 AddTrust External CA Root가 만료되었습니다. 이는 2017년 프랜시스코 파트너스가 코모도 CA를 인수하면서 브랜드명을 섹티고(Sectigo)로 변경하는 과정에서 결정된 사항으로, 다수의 서비스와 시스템에 영향을 준 것으로 보입니다.

HashiCorp 한국 사용자 모임 네 번째 밋업 개최 및 발표 자료

🗒 기사, 2019-09-20 - 2019년 9월 18일에 열렸던 하시코프 한국 사용자 모임 네 번째 밋업의 발표를 간단한 요약과 함께 정리했습니다.