Lors de la définition des choix pour un CharField ou TextField dans un modèle Django, nous avons souvent utilisé des listes de tuples.
Cependant, en utilisant TextChoices introduit dans Django 3.0, nous pouvons écrire un code beaucoup plus propre et significatif.


1. Définition des choix de modèle : la méthode traditionnelle

La façon dont nous avons tendance à écrire est celle des listes de tuples, comme ci-dessous.

# models.py
STATUS_CHOICES = [
    ('DF', 'Brouillon'),
    ('PB', 'Publiée'),
    ('AR', 'Archivée'),
]

class Post(models.Model):
    status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='DF')

Inconvénients de la méthode traditionnelle : - Difficile de comprendre la signification du code ('DF' n'est pas évident à interpréter) - Bien que nous utilisions get_FIELD_display(), ce n'est pas structuré comme un Enum, rendant la maintenance difficile - Nécessité de codage en dur pour les comparaisons de conditions

if post.status == 'DF':
    ...

2. Amélioration avec la méthode TextChoices


En regardant le code source, le principe est simple, donc ceux qui sont curieux de son fonctionnement sont invités à explorer le code source de Django.
Ici, nous voulons simplement expliquer l'utilisation.

# À l'intérieur de models.py
from django.db import models

class PostStatus(models.TextChoices):
    DRAFT = 'DF', 'Brouillon'
    PUBLISHED = 'PB', 'Publiée'
    ARCHIVED = 'AR', 'Archivée'

class Post(models.Model):
    status = models.CharField(max_length=2, choices=PostStatus.choices, default=PostStatus.DRAFT)

Avantages de cette méthode : - Possibilité de traiter les conditions avec un nom significatif comme PostStatus.DRAFT - Support complet de get_status_display() - Traité comme un objet semblable à un enum, favorisant l'autocomplétion IDE et l'analyse statique

if post.status == PostStatus.DRAFT:
    ...
  • Réutilisabilité : si plusieurs modèles doivent partager les mêmes choix, vous pouvez les définir dans un fichier externe (choices.py)

En fait, la réutilisabilité est, selon moi, le plus grand atout de l'utilisation de la classe TextChoice. Étant donné que ce sont des choix utilisés dans plusieurs applications Django, vous pouvez les placer dans commons/choices.py et les appeler de n'importe quelle application.


3. Conclusion


Le TextChoices de Django est une fonctionnalité formidable qui permet de gérer les choix de modèle de manière plus intuitive et robuste.
Évadez-vous de la méthode traditionnelle des listes de tuples et améliorez la qualité de votre code !