Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

Python

새로 출시된 장고(Django) 5.0의 주요 특징과 기능

권현욱(엑셀러) 2023. 12. 10. 20:00
반응형

인기 있는 웹 프레임워크인 장고(Django) 5.0 버전이 최근 출시되었습니다 (23년 12월 4일). 이번 업데이트는 다양한 새로운 기능, 개선 사항 및 최적화를 특징으로 하며 Django 4.2보다 크게 발전했습니다. Django 5.0의 주요 특징과 기능에 대해 소개합니다.

 

권현욱(엑셀러) | 아이엑셀러 닷컴 대표 · Microsoft Excel MVP · Excel 솔루션 프로바이더 · 작가

 

※ 이 글은 아래 기사 내용을 토대로 작성되었습니다만, 필자의 개인 의견이나 추가 자료들이 다수 포함되어 있습니다.


  • 원문: Django 5.0 is here
  • URL: https://medium.com/django-unleashed/django-5-0-is-here-e4c5debcaf13

장고 5.0의 주요 특징

장고 5.0의 주요 특징은 다음과 같습니다.

 

  • Python 호환성이 향상되어 Python 버전 3.10, 3.11 및 3.12를 지원합니다.
  • 관리의 패싯 필터, 양식 필드 렌더링을 위한 단순화된 템플릿, 데이터베이스 계산 기본값과 같은 새로운 기능이 도입되었습니다.
  • 데이터베이스 생성 모델 필드를 구현하여 데이터베이스 상호 작용에 더 많은 유연성과 효율성을 추가합니다.
  • 필드 선택 선언을 위한 확장된 옵션으로 보다 다양하고 동적인 양식 및 모델 필드 구성이 가능합니다.
  • django.contrib.admin, django.contrib.auth 등을 포함한 다양한 Django 모듈 전반에 걸쳐 수많은 사소한 기능이 추가되고 개선되었습니다.
  • 프레임워크를 간소화하고 향후 개발을 위한 발판을 마련하는 것을 목표로 하는 이전 버전과 호환되지 않는 변경 및 지원 중단입니다.

이번 릴리스는 Django의 발전에 중요한 이정표를 세웠으며, 전 세계 개발자에게 향상된 기능과 사용 편의성을 제공합니다.

 

파이썬과의 호환성

Django 5.0은 최신 버전의 Python과의 호환성을 도입하여 범위와 기능을 크게 확장했습니다. Django 5.0버전은 Python 3.10, 3.11 및 3.12를 지원합니다. 이러한 호환성 확장을 통해 Django는 Python의 최신 발전과 동기화되어 개발자에게 Python 생태계의 최신 기능과 개선 사항의 이점을 제공합니다.

 

Django 5.0은 이 세 가지 Python 버전을 지원하지만 Django 팀은 각 시리즈의 최신 릴리스를 사용할 것을 적극 권장합니다. 이는 최상의 성능, 보안 및 최신 기능에 대한 액세스를 보장하기 위한 것입니다.

 

최신 Python 릴리스를 사용하면 개발자는 Django 5.0의 모든 잠재력을 활용하여 최신 Python 버전과 함께 제공되는 최적화된 호환성 및 향상된 기능의 이점을 누릴 수 있습니다.

 

장고 5.0의 새로운 기능

관리자의 패싯(Facet) 필터

Django 5.0에는 관리자 변경 목록에 적용된 필터에 대한 facet counts가 도입되었습니다. UI를 통해 전환할 수 있는 이 기능은 필터와 함께 패싯 개수를 표시하고 데이터 배포에 대한 빠른 개요를 제공함으로써 관리 인터페이스를 향상시킵니다. 패싯 필터의 동작은 ModelAdmin.show_facets 속성을 사용하여 구성할 수 있습니다.

 

양식 필드 렌더링을 위한 단순화된 템플릿

이 릴리스에서는 필드 그룹 템플릿을 도입하여 Django 양식 필드의 렌더링을 단순화했습니다. 이러한 템플릿은 레이블, 위젯, 도움말 텍스트 및 오류와 같은 양식 필드 구성 요소의 효율적인 렌더링을 촉진하여 양식 표시의 효율성과 명확성을 모두 향상시킵니다.

 

Before:

<form>
...
<div>
  {{ form.name.label_tag }}
  {% if form.name.help_text %}
    <div class="helptext" id="{{ form.name.auto_id }}_helptext">
      {{ form.name.help_text|safe }}
    </div>
  {% endif %}
  {{ form.name.errors }}
  {{ form.name }}
  <div class="row">
    <div class="col">
      {{ form.email.label_tag }}
      {% if form.email.help_text %}
        <div class="helptext" id="{{ form.email.auto_id }}_helptext">
          {{ form.email.help_text|safe }}
        </div>
      {% endif %}
      {{ form.email.errors }}
      {{ form.email }}
    </div>
    <div class="col">
      {{ form.password.label_tag }}
      {% if form.password.help_text %}
        <div class="helptext" id="{{ form.password.auto_id }}_helptext">
          {{ form.password.help_text|safe }}
        </div>
      {% endif %}
      {{ form.password.errors }}
      {{ form.password }}
    </div>
  </div>
</div>
...
</form>

 

After:

<form>
...
<div>
  {{ form.name.as_field_group }}
  <div class="row">
    <div class="col">{{ form.email.as_field_group }}</div>
    <div class="col">{{ form.password.as_field_group }}</div>
  </div>
</div>
...
</form>

 

데이터베이스 계산 기본값

Django 5.0에서는 Field.db_default 매개변수를 사용하여 데이터베이스 계산 기본값을 설정할 수 있습니다.

from django.db import models
from django.db.models.functions import Now, Pi

class MyModel(models.Model):
    age = models.IntegerField(db_default=18)
    created = models.DateTimeField(db_default=Now())
    circumference = models.FloatField(db_default=2 * Pi())

 

이 기능은 데이터베이스 수준에서 직접 기본값을 처리하는 데 더 많은 유연성을 제공합니다.

 

데이터베이스 생성 모델 필드

Django 5.0의 새로운 GeneratedField를 사용하면 데이터베이스 생성 열을 생성할 수 있습니다. 이 필드는 모든 데이터베이스 백엔드에서 지원되며 다른 필드에서 계산되는 필드에 유용합니다.

from django.db import models
from django.db.models import F

class Square(models.Model):
    side = models.IntegerField()
    area = models.GeneratedField(
        expression=F("side") * F("side"),
        output_field=models.BigIntegerField(),
        db_persist=True,
    )

 

이 기능은 데이터베이스 성능을 최적화하고 데이터 무결성을 보장하는 데 특히 유용합니다.

 

필드 선택 선언을 위한 추가 옵션

Django 5.0의 Field.choices는 더 큰 유연성을 제공합니다. Field.choices는 이제 ChoiceField.choices반복 가능 항목 외에도 매핑 또는 호출 가능 항목을 지원합니다.

from django.db import models

Medal = models.TextChoices("Medal", "GOLD SILVER BRONZE")

SPORT_CHOICES = {
    "Martial Arts": {"judo": "Judo", "karate": "Karate"},
    "Racket": {"badminton": "Badminton", "tennis": "Tennis"},
    "unknown": "Unknown",
}

def get_scores():
    return [(i, str(i)) for i in range(10)]

class Winner(models.Model):
    name = models.CharField(...)
    medal = models.CharField(..., choices=Medal)
    sport = models.CharField(..., choices=SPORT_CHOICES)
    score = models.IntegerField(choices=get_scores)

 

이 업데이트는 모델 및 양식 내에서 선택 항목을 선언하고 처리하는 방식을 단순화합니다.

 

다양한 모델의 사소한 기능

Django 5.0에는 다양한 모듈에 걸쳐 다양한 사소한 기능도 포함되어 있습니다.

 

  • django.contrib.admin: 로그 항목 쿼리 집합 사용자 지정 및 관리자 클래스 검색을 위한 새로운 메서드, 업데이트된 jQuery 버전 및 향상된 목록 표시 속성이 추가되었습니다.
  • django.contrib.auth: PBKDF2 비밀번호 해셔 및 새로운 비동기 기능에 대한 기본 반복 횟수가 늘어났습니다.
  • django.contrib.contenttypes: GenericForeignKey 프리페치 지원이 향상되었습니다.
  • django.contrib.gis: GIS 데이터 처리를 위한 새로운 함수 및 방법과 GDAL 및 GEOS 버전에 대한 지원이 업데이트되었습니다.
  • django.contrib.messages: 메시지에 대한 새로운 테스트 방법입니다.
  • django.contrib.postgres: 유효성 검사 오류 코드를 사용자 정의하기 위한 새로운 속성을 추가했습니다

 

장고 5.0의 이전 버전과 호환되지 않는 변경 사항

데이터베이스 백엔드 API의 변경 사항

Django 5.0에는 타사 데이터베이스 백엔드에 영향을 미칠 수 있는 변경 사항이 도입되었습니다. 특히  supports_expression_defaults, supports_default_keyword_in_insert 및 supports_default_keyword_in_bulk_insert 같은 새로운 속성은 데이터베이스 기능을 반영하도록 적절하게 설정되어야 합니다.

 

django.contrib.gis에서 이전 버전의 GDAL 및 GEOS에 대한 지원 제거

이전 버전의 GDAL(2.2 및 2.3) 및 GEOS(3.6 및 3.7)에 대한 지원이 django.contrib.gis 모듈에서 제거되어 향상된 지리공간 기능을 위한 최신 버전에 맞춰졌습니다.

django.contrib.sitemaps의 변경 사항

Google Sitemaps ping 엔드포인트 지원 중단에 대한 응답으로 함수 ping_google()및 ping_google관리 명령이 django.contrib.sitemaps에서 제거되었습니다.

MySQL 버전 < 8.0.11에 대한 지원 중단

Django 5.0은 더 이상 MySQL 8.0.x 시리즈의 사전 릴리스를 지원하지 않습니다. 이제 MySQL의 최소 지원 버전은 8.0.11로, 최신 데이터베이스 기능 및 보안 개선 사항과의 호환성을 보장합니다.

 

QuerySet.update_or_create() 메서드 업데이트

이제 QuerySet의 update_or_create() 메서드에 create_defaults 매개 변수가 포함됩니다. update_or_create()에 사용되는 create_defaults라는 이름의 필드가 있는 모델은 조회에서 create_defaults__exact로 필드를 지정해야 합니다.

 

MariaDB 10.7 이상에서 UUIDField 마이그레이션 필요

MariaDB 10.7 이상에서는 UUIDField가 CHAR(32) 대신 UUID 열로 생성됩니다. 이전 버전의 Django에 있는 기존 UUIDField 열을 마이그레이션해야 합니다.

class Char32UUIDField(models.UUIDField):
    def db_type(self, connection):
        return "char(32)"

class MyModel(models.Model):
    uuid = Char32UUIDField(primary_key=True, default=uuid.uuid4)

 

장고 5.0에서 더 이상 사용되지 않는 기능

Form Renderers: DjangoDivFormRenderer 및 Jinja2DivFormRenderer 과도기적 폼 렌더러는 더 이상 사용되지 않습니다.

BaseConstraint Arguments: 키워드 전용 인수를 위해 위치 인자 name과 위반 오류 메시지를 BaseConstraint에 전달하는 것은 더 이상 사용되지 않습니다.

ModelAdmin.lookup_allowed(): ModelAdmin.lookup_allowed()의 시그니처에 요청을 추가. 이 인수를 허용하지 않는 서브클래스에 대한 지원은 더 이상 사용되지 않습니다.

ForeignObject Methods: ForeignObject 및 ForeignObjectRel의 get_joining_columns() 메서드는 더 이상 사용되지 않습니다. 서브클래스는 대신 get_joining_fields()를 구현해야 합니다.

Forms URLField Scheme: 장고 6.0에서는 forms.URLField의 기본 스키마가 "http"에서 "https"로 변경됩니다. 과도기적 설정인 FORMS_URLFIELD_ASSUME_HTTPS도 더 이상 사용되지 않습니다.

Database Operations: DatabaseOperations.field_cast_sql()이 더 이상 사용되지 않고 DatabaseOperations.lookup_cast()가 사용됩니다.

ChoicesMeta 메타클래스: django.db.models.enums.ChoicesMeta 메타클래스의 이름이 ChoicesType으로 변경되었습니다.

Prepatch Methods: Prefetch.get_current_queryset() 및 관련 관리자의 get_prefetch_queryset() 메서드가 더 이상 사용되지 않습니다. 

 

장고 5.0에서 제거된 기능

테스트 설정: SERIALIZE 테스트 설정을 제거합니다.

문서화되지 않은 모듈: 문서화되지 않은 django.utils.baseconv 및 django.utils.datetime_safe 모듈이 제거되었습니다.

설정 변경:
- USE_TZ 설정의 기본값이 False에서 True로 변경되었습니다.
- USE_L10N 및 USE_DEPRECATED_PYTZ 설정이 제거되었습니다.
- pytz 시간대 지원이 제거되었습니다.

GIS 클래스: django.contrib.gis.admin.GeoModelAdmin 및 OSMGeoAdmin 클래스를 제거합니다.

양식 렌더링: 기본 양식 및 양식 집합 렌더링 스타일이 div 기반으로 변경되었으며 관련 템플릿이 제거되었습니다.

사이트맵 및 CSRF 변경: 사이트맵 관련 기능의 다양한 변경 사항과 CSRF_COOKIE_MASKED 과도기 설정이 제거되었습니다.

포스트그레스 집계: 행이 없을 때 특정 포스트그레스 집계의 동작이 변경되었습니다.

기타 제거:
- 시간대, 해싱 및 쿼리 집합과 관련된 여러 메서드, 인수 및 기능
- django.contrib.sessions.serializers.PickleSerializer 제거
- 저장되지 않은 모델 인스턴스를 관련 필터로 전달하는 기능 중단
- django.utils.timezone.utc 별칭 제거

 

결론

주요 시사점 요약

  • Django 5.0에는 관리 및 데이터베이스 계산 기본값의 패싯 필터와 같은 새로운 기능을 포함하여 중요한 업데이트가 도입되었습니다.
  • Python 3.10, 3.11 및 3.12를 지원하며 최신 Python 릴리스를 사용하는 것이 좋습니다.
  • 업데이트에는 이전 버전과 호환되지 않는 변경 사항과 더 이상 사용되지 않는 기능의 제거가 포함되어 프레임워크 현대화를 향한 움직임을 알립니다.

Django 개발자를 위한 시사점

  • 개발자는 Python 호환성, 데이터베이스 기능 및 템플릿 렌더링의 변화에 ​​적응해야 합니다.
  • 원활한 전환을 위해서는 이전 버전과 호환되지 않는 변경 사항을 인식하고 계획하는 것이 중요합니다.

업그레이드 및 적응에 대한 권장 사항

  • 변경 사항의 영향을 이해하려면 릴리스 노트를 철저하게 검토하세요.
  • Django 5.0으로 업그레이드하기 전에 준비 환경에서 애플리케이션을 광범위하게 테스트하세요.
  • 새로운 기능과 제거된 기능을 준수하도록 코드를 업데이트하고 리팩터링합니다.
  • 향후 업데이트에 대한 정보를 얻고 Django 개발의 지속적인 발전에 대비하세요.