4 grudnia 2023 roku wydano Django 5.0. To również oznacza zakończenie wspierania wersji 4.1, wersja 4.2 LTS będzie otrzymywać łatki bezpieczeństwa do kwietnia 2026.
W tym artykule skupię się na najważniejszych, moim zdaniem, zmianach, jakie wprowadza Django 5.0.
Wsparcie nowych wersji Pythona
Najważniejszą zmianą w nowej wersji jest wsparcie dla najnowszych wersji: Pythona 3.10, Pythona 3.11 i Pythona 3.12. Zalecam korzystanie z najnowszych wersji języka. Pozwala to na wykorzystanie nowych funkcji i poprawek.
Usprawnienia panelu administracyjnego
Django 5.0 wprowadza funkcję liczenia wyników dla filtrów zastosowanych w panelu admina, co znacząco zwiększa jego użyteczność. Zobacz: ModelAdmin.ShowFacets
Usprawnienia formularzy
Ciekawym usprawnieniem są grupy pól w formularzach.
Skomplikowany formularz
<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>
Można uprościć do:
<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>
Zobacz: https://docs.djangoproject.com/en/5.0/releases/5.0/#simplified-templates-for-form-field-rendering
Zmiany w modelach
Domyślne wartości obliczane w bazie danych
Nowy parametr Field.db_default ustawia wartość domyślną obliczoną przez bazę danych. Na przykład:
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())
Pole modelu generowane w bazie danych
GeneratedField pozwala na tworzenie kolumn generowanych w bazie danych, które obliczają swoją wartość na podstawie innych pól w modelu. Pozwala to uprościć operacje związane z obliczeniami na bazie danych.
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,
)
Więcej możliwości deklarowania pól wyboru
Field.Choices oraz ChoiceField.choices pozwala na większą swobodę deklarowania wartości. Teraz można używać callable lub mappingi. To znacząco ułatwia tworzenie opcji generowanych "w locie".
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) # Using `.choices` not required.
sport = models.CharField(..., choices=SPORT_CHOICES)
score = models.IntegerField(choices=get_scores) # A callable is allowed.
Zobacz: https://docs.djangoproject.com/en/5.0/ref/models/fields/#field-choices
Zmiany niekompatybilne wstecz
- API Backendów Baz Danych: Zmiany w obsłudze domyślnych wartości i wsparcia dla słowa kluczowego
DEFAULT
. - GIS: Usunięto wsparcie dla starszych wersji GDAL (2.2 i 2.3) i GEOS (3.6. 3.7).
- MySQL: Brak wsparcia dla wersji MySQL starszych niż 8.0.11.
- UUIDField na MariaDB 10.7+:
UUIDField
teraz jako kolumnaUUID
, a nieCHAR(32)
. Ta zmiana wymaga migracji bazy. Zobacz: https://docs.djangoproject.com/en/5.0/releases/5.0/#migrating-uuidfield - Funkcja QuerySet.update_or_create() obsługuje teraz parametr create_defaults. W rezultacie wszystkie modele posiadające pole o nazwie create_defaults używane z funkcją update_or_create() powinny określać to pole podczas wyszukiwania za pomocą funkcji create_defaults__exact.
Podsumowanie
Nowa wersja Django przynosi kilka ciekawych usprawnień. Z mojego punktu widzenia najciekawszą jest możliwość użycia callable w generowaniu opcji formularzy - akurat tego potrzebuje w projekcie.
Niemniej - to czy aktualizować projekt, czy nie, to złożona decyzja. Ja poczekam na wersje LTS (long time support).
Oprócz opisanych powyżej zmian, wersja 5.0 wprowadza jeszcze wiele innych usprawnień i zmian, które mogą mieć wpływ na Wasze aplikacje. Warto zajrzeć do oficjalnej dokumentacji Django.
Zapraszam do zadawania pytań przez formularz kontaktowy. Pamiętaj, że jeśli potrzebujesz wsparcia, możesz napisać do mnie - pomogę.
Spodobał Ci się post?
Podziel się nim!
Masz uwagi do posta, chcesz porozmawiać, szukasz pomocy z Pythonem i Django? Napisz do mnie!