Django 1.11 릴리스와 주요 변경 사항
사진 출처: Pinkie Pie by Daniel Chang
Django 1.11이 드디어 출시되었습니다. 1.x에서는 마지막 버전인데요. 이 글에서는 Django 1.11에 추가된 기능과 바뀐점을 간략하게 알아보려 합니다. Django 공식 릴리스 노트를 참고하였습니다. 주의! 릴리스 노트를 모두 번역하지는 않았습니다.
2017-05-11 수정 내역
shlee322 님의 제보로 include 태그와 관련된 내용을 수정하였습니다.
파이썬 호환성
Django 1.11은 파이썬 2.7, 3.4, 3.5, 3.6에서 작동합니다. 3.6을 지원하는 첫 Django 버전입니다. 각 버전별 마지막 릴리스를 사용하기를 추천합니다.
Django 1.11.x는 파이썬 2를 지원하는 마지막 버전입니다. 다음 번 메이저 릴리스인 Django 2.0부터는 파이썬 3.5 이상만 지원할 예정입니다.
새 기능
Index 클래스
Meta 클래스의 indexes 항목에서 인덱스할 필드를 지정할 수 있고, 이를 위한 Index 클래스도 추가되었습니다.
템플릿 기반의 폼 위젯 렌더링
폼 렌더링 API가 추가되었고, 이를 활용하여 특정 폼 위젯을 커스터마이징할 수 있습니다.
하위 쿼리 표현식
쿼리 결과를 다른 쿼리에서 참조할 수 있는 Subquery 표현식과 쿼리 결과가 존재할 때만 실행할 수 있는 Exists 표현식이 추가되었습니다.
자잘하게 추가된 기능
CSRF_USE_SESSIONS
을 설정하여 CSRF 토큰을 쿠키가 아닌 세션에 저장할 수 있습니다(기본 값은 False).- PostgreSQL 하에서
QuerySet.iterator()
메서드가 서버 측 커서를 사용하여 서버의 메모리 부담을 데이터베이스 메모리로 돌릴 수 있습니다. - Form에서
get_initial_for_field()
메서드를 사용하여, 필드의 초기 값을 지정할 수 있습니다. - loaddata 명령에 --exclude 옵션이 추가되었습니다. 특정 모델이나 앱을 제외하고 픽스처 데이터를 불러올 수 있습니다.
- showmigrations 명령에서 --plan 옵션을 사용할 때도 app_label을 지정할 수 있습니다.
get_or_create()
메서드와update_or_create()
메서드에서defaults
의 값으로 함수 값(callable value)을 지정할 수 있습니다.- DateTime이나 TimeField에 대해 Trunc 클래스를 적용하면, 특정 부분 이하를 자를 수 있습니다.
# 월 단위
2017-02-28 20:11:24.021458+09:00 => 2017-01-01 00:00:00.000000+09:00
# 일 단위
2017-02-28 20:11:24.021458+09:00 => 2017-02-01 00:00:00.000000+09:00
# 시 단위
2017-02-28 20:11:24.021458+09:00 => 2017-02-28 00:00:00.000000+09:00
- 쿼리셋의
values()
메서드와values_list()
메서드에서도 표현식을 사용할 수 있습니다. - 쿼리 표현식에서 정렬시 null 값을 앞에 오거나 뒤에 오도록 지정할 수 있습니다.
- 두 쿼리셋의 교집합과 합집합, 차집합을 만들 수 있는
union()
메서드,intersection()
메서드,difference()
메서드가 추가되었습니다.
바뀐 점
collectstatic 실행시 파일 간 순환 참조가 존재하면 오류 발생
해시 값이 붙은 정적 파일 저장소를 사용하고 있을 때,
a.css
에서 b.css
를 참조하고 b.css
에서도 a.css
를 참조한다면 collectstatic 명령이 실패합니다.
DateTimeField에 대해 상세 룩업 지원
- DateField에 대해 week 룩업을 지원합니다.
- DateTimeField에 대해 time 룩업을 지원합니다.
USE_TZ
옵션이True
라면 필드의 값이 현지 시각으로 바뀌어 리턴됩니다.
PostgreSQL 9.2와 PostGIS 2.0 지원 중단
PostgreSQL 9.2의 지원이 2017년 9월에 끝남에 따라, Django 1.11에서는 PostgreSQL 9.3을 최소 지원 버전으로 지정하였습니다.
LiveServerTestCase가 포트 0에 바인드
아울러 DJANGO_LIVE_TEST_SERVER_ADDRESS
옵션이 사라지고, manage.py test
명령에 --liveserver
옵션도 삭제되었습니다.
get_or_create()
와 update_or_create()
에서 변수명 검사
모델에 없는 필드를 지정할 경우 오류가 발생합니다. (이전에는 그냥 무시했기 때문에, 타이핑 실수를 찾기가 어려웠죠.)
pytz 패키지 의존성이 추가되었고, TIME_ZONE = None
옵션이 사라집니다.
자동으로 타임존을 설정할 때는 settings 파일에 TIME_ZONE = None
대신 다음처럼 하세요.
from tzlocal import get_localzone
TIME_ZONE = get_localzone().zone
사소한 변경
- 테스트를 실행할 때도
ALLOWED_HOSTS
를 검사합니다. 테스트용 호스트 이름을 사용하고 있다면 이 이름을ALLOWED_HOSTS
에도 넣어야 합니다. - 모델 폼에서 CharField가 null=True인 경우, 빈 문자열 대신 NULL을 저장합니다.
- 체크박스와 셀렉트박스 폼을 렌더링할 때
checked='checked'
,selected='selected'
대신checked
,selected
만 넣습니다.
삭제된 기능
models.permalink 데코레이터
대신 django.urls.reverse()
를 사용해야 합니다.
contrib.auth의 각종 함수 기반 뷰
인증과 관련된 함수 기반 뷰들이 클래스 기반 뷰로 바뀌었습니다.
login()
-> LoginViewlogout()
-> LogoutViewpassword_change()
-> PasswordChangeViewpassword_change_done()
-> PasswordChangeDoneViewpassword_reset()
-> PasswordResetViewpassword_reset_done()
-> PasswordResetDoneViewpassword_reset_confirm()
-> PasswordResetConfirmViewpassword_reset_complete()
-> PasswordResetCompleteView
{% include %}
탬플릿 태그 렌더링시 예외를 발생시키지 않았던 부분
include 태그를 렌더링하는 동안 예외가 발생하면 조용히 넘어갔는데, 이것이 꽤나 혼란을 주었나 봅니다. Django 2.1부터는 include 태그를 사용했을 때 예외가 발생합니다.
COMMENTS