백엔드 개발 능력에 AI 활용 능력까지 더하면 어떻게 되는지 궁금해?!
#소프트웨어 

Django 5 버전 변경사항

django 5.0 의 주요 변경점은 무엇일까요?

2024-03-28 | 김성혁

Django 5.0 버전이 2023년 12월에 출시 하였습니다.
릴리즈 노트를 참고하여 주요 변경 부분에 대하여 정리해보고자 합니다.

Python 호환성

Django 5.0은 Python 3.10, 3.11 및 3.12를 지원합니다. 각 시리즈의 최신 릴리스만 공식적으로 지원할 것을 적극 권장합니다.
Django 4.2.x 시리즈는 Python 3.8 3.9 지원하는 마지막 버전입니다.

Django 5.0의 새로운 기능

어드민의 패싯(Facet) 필터

UI를 토글하면 이제 관리자 변경 목록에 적용된 필터에 대한 패싯 수가 표시됩니다. 이 동작은 새로운 ModelAdmin.show_facets 속성을 통해 변경할 수 있습니다. 자세한 내용은 패싯을 참조하세요.

Form field렌더링을 위한 심플한 템플릿

Django 5.0에는 필드 그룹과 필드 그룹 템플릿이라는 개념이 도입되었습니다. 이를 통해 Label, Widget, 도움말 텍스트 및 Error와 같은 django form field 의 관련 요소의 렌더링이 간소화됩니다.
아래 템플릿을 예로 들어보겠습니다:

<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>

다음으로 단순화할 수 있습니다:

<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>

as_field_group()은 기본적으로 “django/forms/field.html” 템플릿을 사용하여 필드를 렌더링하며 프로젝트별, 필드별 또는 요청별로 사용자 정의할 수 있습니다. 재사용 가능한 필드 그룹 템플릿을 참조하세요.

기본값을 데이터베이스에서 연산

새로운 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())

데이터베이스 Generated model field

새로운 GeneratedField를 사용하면 데이터베이스에서 Generated column을 만들 수 있습니다. 이 필드는 지원되는 모든 데이터베이스 백엔드에서 다른 필드에서 항상 계산되는 필드를 만드는 데 사용됩니다.
예시입니다:

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,
    )

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

Field.choices(모델 필드용)와 ChoiceField.choices( form 필드용)를 사용하면 값을 선언할 때 더 유연하게 사용할 수 있습니다. 이전 버전의 장고에서 선택 항목은 2-tuple의 목록이거나 열거 형 유형의 서브클래스여야 했지만, 후자의 경우 예상되는 형식으로 값을 제공하기 위해 .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"),
]


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

Django 5.0에서는 iterable 대신 mapping 또는 callable을 허용하는 기능이 추가되었으며, 열거 형을 확장하기 위해 더 이상 .choices를 직접 사용할 필요가 없습니다

from django.db import models

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

SPORT_CHOICES = {  # Using a mapping instead of a list of 2-tuples.
    "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)  # `.choices` 사용이 필요하지 않습니다
    sport = models.CharField(..., choices=SPORT_CHOICES)
    score = models.IntegerField(choices=get_scores)  # callable 허용

내부적으로 제공된 choices은 choices 값이 업데이트될 때마다 정규 형 2-튜플 목록으로 정규화됩니다. 자세한 내용은 choices에 대한 모델 필드 레퍼런스를 참조하세요.