GeneratedField en profondeur
Django 5.0 introduit GeneratedField, un champ dont la valeur est calculée par la base de données. Le champ peut être stored (persisté sur disque) ou virtual (calculé à la volée). Cela remplace les annotations ou les triggers manuels.
Exemple
python
from django.db import models
from django.db.models import F, Value
from django.db.models.functions import Lower, Concat
class Product(models.Model):
name = models.CharField(max_length=200)
price_ht = models.DecimalField(max_digits=10, decimal_places=2)
tax_rate = models.DecimalField(max_digits=4, decimal_places=2)
# Champ calculé par la BDD (stored)
price_ttc = models.GeneratedField(
expression=F('price_ht') * (1 + F('tax_rate')),
output_field=models.DecimalField(max_digits=10, decimal_places=2),
db_persist=True,
)
# Slug auto-généré (virtual)
name_lower = models.GeneratedField(
expression=Lower('name'),
output_field=models.CharField(max_length=200),
db_persist=False,
)
