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!
Add a New Comment