Canvas 1 Layer 1

Django 2.2 LTS 릴리스와 주요 변경 사항

Django 2.2가 드디어 출시되었습니다. 2.x 버전으로는 첫 LTSLong-term Support Release입니다. 이 글에서는 Django 2.2에 추가된 기능과 바뀐 점을 알아보려 합니다. Django 2.2 공식 릴리스 노트 를 참고하였습니다.

주의! 개인적으로 판단하기에 사소한 사항들은 번역하지 않았고, 릴리스 노트만으로 이해하기가 어려운 기능엔 설명을 조금 보태었습니다.

파이썬 호환성

Django 2.2는 파이썬Python 3.5, 3.6, 3.7에서 작동합니다. 각 버전별 마지막 릴리스를 사용하기를 추천합니다.

새 기능

모델 제약 조건인 CheckConstraint와 UniqueConstraint

모델의 Meta.contraints 옵션에 CheckConstraintUniqueConstraint를 사용하여, 데이터베이스 제약 조건을 추가할 수 있습니다. 예를 들어 여덟 자 이하로는 비밀번호를 저장하지 않으려고 한다면,

사소한 변경

django.contrib.admin

TabularInline의 컬럼 헤더에 CSS 클래스를 추가할 수 있습니다.

django.contrib.auth

RemoteUserBackend.configure_user()의 첫 번째 인자로 HttpRequest 객체를 전달할 수 있습니다.

django.contrib.postgres

ArrayAggStringAgg를 사용하면서 애그리게이트 객체의 순서를 결정하기 위해 ordering 인자를 지정할 수 있습니다.

django.contrib.staticfiles

collectstatic –ignore 옵션에 /vender/*.js 같은 패턴을 추가할 수 있습니다.

데이터베이스 백엔드

SQLite에서 QuerySet.iterator()를 실행해도 결과를 일부분씩만 얻을 수 있습니다. (다른 데이터베이스에 대해서는 이미 지원하던 기능인데, 이번에 SQLite에 대해서도 지원하기 시작했습니다.)

제네릭 뷰

dispatch() 전에 뷰 속성을 초기화하는 View.setup 훅이 추가되었습니다.

국제화

아르메니아 언어հայերեն 에 대한 지원과 번역이 추가되었습니다.

관리용 명령어

마이그레이션

모델

요청과 응답

직렬화

테스트

URL

Validator

하위 호환이 중단된 기능

Django Admin의 actions 수집 방식

Django 관리 도구의 actions에서 부모 ModelAdmin 클래스의 actions를 수집하지 않습니다. 부모 클래스의 actions까지 사용하고 싶다면 파이썬의 기본 상속 방식을 따라, 다음과 같이 해야 합니다.

class SubAdmin(BaseAdmin):
    actions = BaseAdmin.actions + ['sub_admin_action']

GDAL 지원

Geo Django에서 GDAL 1.9와 1.10 지원을 중단합니다.

테스트 실행시 초기화용 데이터 마이그레이션

초기화용 데이터 마이그레이션 과정은 기존 데이터베이스가 삭제된 후 테스트의 마지막에 실행됩니다. 이전 버전에서는 테스트 시작 부분에 실행되었는데 이 때문에 test --keepdb 옵션이 제대로 작동하지 않곤 했습니다. (기본 TransactionTestCase를 수정하지 않았다면, 여러분의 테스트 케이스에 아무런 영향을 주지 않을 겁니다.)

sqlparse 라이브러리 의존성 추가

sqlparse 라이브러리 의존성이 추가되었습니다.

cached_property를 alias화하기

일반적인 방식으로는 cached_property를 alias화할 수 없습니다.

class Sample:
    @cached_property
    def method_name(self):
        return ...
    m_name = method_name

대신, 이렇게 할 수 있습니다.

import operator

class Sample:
    @cached_property
    def method_name(self):
        return ...

    m_nmae = property(operator.attrgetter('method_name'))

프록시 모델의 권한

이전 버전에서는 프록시 모델에 권한을 설정하더라도, (프록시 모델이 아닌) 구체concrete 모델의 content type이 생성되었습니다. 이제부터는 프록시 모델은 권한을 상속받지 않습니다. 따라서, 프록시 모델에 자체적인 권한을 설정하면 프록시 모델의 content type이 생성됩니다.

class Animal(models.Model):
    class Meta:
        permissions = (('can_sleep', 'Can sleep'))

class Cat(Animal):
    class Meta:
        proxy = True
        permissions = (('can knead', 'Can knead'))

>>> content_type = ContentType.objects.get_for_model(Cat, for_concrete_model=False)
>>> cat_permissions = Permission.objects.filter(content_type=content_type)
>>> [perm.codename for perm in cat_permissions]
['add_cat', 'change_cat', 'delete_cat', 'view_cat', 'can_knead']

폼의 Media 에셋

폼의 Media 에셋들을 합칠 때 위상 정렬topological sort algorithm 알고리즘을 사용합니다. 이전에 사용하던 쌍 정렬pairwise merging algorithm이 몇몇 경우에 제대로 작동하지 않았기 때문입니다. 이 변화로 인해, 의존성을 명시하지 않은 자바스크립트 파일과 CSS 파일은 제대로 정렬되지 않을 수 있습니다.

예를 들어, django.jQuery를 의존하는 위젯에서는 폼 미디어 에셋을 정의할 때 반드시 js = ['admin/js/jquery.init.js']를 명시해야 합니다.

자잘한 변경

중단 예정인 기능

Meta.ordering이 GROUP BY에 영향을 끼치지 않음

모델의 Meta.ordering 속성은 GROUP BY 쿼리에 영향을 끼치지 않습니다. 이런 식의 쿼리를 작성하면 order_by()를 추가하라는 안내문이 나타나며, Django 3.1부터는 이런 식의 쿼리가 무시될 예정입니다.

자잘한 변경

요약은 여기까지입니다. 개인적으론 중요하지 않아 보여서 적지 않은 내용이 여러분에겐 더 중요할 수도 있으니, Django 2.2 공식 릴리스 노트를 꼼꼼히 살펴보시는 건 어떨까요?