Al definir las opciones de CharField o TextField en un modelo de Django, a menudo hemos utilizado listas de tuplas.
Sin embargo, al utilizar TextChoices, introducido en Django 3.0, podemos escribir un código mucho más limpio y significativo.


1. Definición de opciones de modelo: método tradicional

La forma en que solemos escribir es utilizando el método de listas de tuplas como se muestra a continuación.

# models.py
STATUS_CHOICES = [
    ('DF', 'Borrador'),
    ('PB', 'Publicado'),
    ('AR', 'Archivado'),
]

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

Desventajas del método tradicional: - Dificultad para entender el significado del código (es difícil saber de inmediato qué es 'DF') - Aunque se utiliza get_FIELD_display(), no está estructurado como un Enum, lo que complica el mantenimiento - Es necesario el uso de código duro en comparaciones de condiciones

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

2. Mejora con el método TextChoices


Al observar el código fuente, el principio es simple, por lo que recomiendo a quienes tengan curiosidad sobre su funcionamiento que revisen el código fuente de Django.
Aquí simplemente explicaré el método.

# dentro de models.py
from django.db import models

class PostStatus(models.TextChoices):
    DRAFT = 'DF', 'Borrador'
    PUBLISHED = 'PB', 'Publicado'
    ARCHIVED = 'AR', 'Archivado'

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

Ventajas de este método: - La posibilidad de manejar condiciones con nombres significativos como PostStatus.DRAFT - Soporte completo para get_status_display() - Se puede tratar como un objeto, lo que favorece la autocompletación en IDE y análisis estáticos

if post.status == PostStatus.DRAFT:
    ...
  • Reutilización: si varios modelos necesitan compartir las mismas opciones, se pueden definir en un archivo externo (choices.py)

En realidad, la reutilización es la mayor ventaja de usar esta clase TextChoices. Si las opciones son comúnmente utilizadas en varias aplicaciones de Django, se pueden colocar en commons/choices.py, permitiendo su uso en cualquier aplicación.


3. Conclusión


Las TextChoices de Django son una excelente herramienta que ayuda a tratar las opciones de modelo de manera más intuitiva y robusta.
¡Sal de la antigua forma de listas de tuplas y mejora la calidad de tu código!