Wenn wir Auswahlmöglichkeiten für CharField oder TextField in Django-Modellen definieren, verwenden wir häufig eine Liste von Tupeln.
Mit der Einführung von TextChoices in Django 3.0 können wir jedoch viel saubereren und aussagekräftigen Code schreiben.


1. Definition von Auswahlmöglichkeiten in Modellen: Traditionelle Methode

Die gängige Methode ist die Verwendung einer Liste von Tupeln, wie im Folgenden gezeigt.

# models.py
STATUS_CHOICES = [
    ('DF', 'Draft'),
    ('PB', 'Published'),
    ('AR', 'Archived'),
]

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

Nachteile der traditionellen Methode: - Schwierigkeit, den Code zu verstehen ('DF' ist nicht sofort klar) - Obwohl get_FIELD_display() verwendet wird, ist es nicht in einer Enum-Struktur organisiert, was die Wartung erschwert - Hardcoding ist nötig bei Bedingungsvergleichen

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

2. Verbesserungen mit der TextChoices-Methode


Der Quellcode ist einfach, daher empfehle ich allen, die an der Funktionsweise interessiert sind, einen Blick in den Django-Quellcode zu werfen.
Hier geht es lediglich um die Verwendung.

# models.py
from django.db import models

class PostStatus(models.TextChoices):
    DRAFT = 'DF', 'Draft'
    PUBLISHED = 'PB', 'Published'
    ARCHIVED = 'AR', 'Archived'

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

Vorteile dieser Methode: - Bedingungsverarbeitung ist mit sinnvollen Namen wie PostStatus.DRAFT möglich - Vollständige Unterstützung von get_status_display() - Kann wie ein Objekt behandelt werden, was die IDE-Autovervollständigung und statische Analyse erleichtert

if post.status == PostStatus.DRAFT:
    ...
  • Wiederverwendbarkeit: Wenn mehrere Modelle die gleichen Auswahlmöglichkeiten teilen müssen, können diese in einer externen Datei (choices.py) definiert werden.

In der Tat denke ich, dass die Wiederverwendbarkeit der größte Vorteil der Verwendung der TextChoice-Klasse ist. Wenn es Auswahlmöglichkeiten gibt, die in mehreren Django-Apps gemeinsam verwendet werden, können sie in commons/choices.py abgelegt werden, sodass sie in jeder App genutzt werden können.


3. Fazit


Die TextChoices in Django ist eine hervorragende Funktion, die es ermöglicht, Auswahlmöglichkeiten in Modellen intuitiver und robuster zu handhaben.
Verlassen Sie sich auf die veraltete Methode mit Tupellisten und heben Sie die Codequalität auf ein neues Level!