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

Sources