Wanneer we keuzes definiëren voor CharField
of TextField
in Django-modellen, maken we vaak gebruik van een lijst met tuples.
Maar vanaf Django 3.0, door gebruik te maken van TextChoices
, kunnen we veel nettere en betekenisvollere code schrijven.
1. Definiëren van modelkeuzes: de traditionele methode
De manier waarop we het eenvoudig gebruiken, is de onderstaande tuples-lijst methode.
# 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')
Nadelen van de traditionele methode:
- Moeilijk te begrijpen wat de code betekent ('DF'
is niet meteen duidelijk)
- Hoewel get_FIELD_display()
wordt gebruikt, is het niet gestructureerd als een Enum, wat onderhoud moeilijk maakt
- Hardcoding is nodig voor vergelijking van voorwaarden
if post.status == 'DF':
...
2. Verbeterd met de TextChoices-methode
Als je de broncode bekijkt, is het principe eenvoudig, dus ik raad degenen die nieuwsgierig zijn naar de werking aan om de Django-broncode te verkennen.
Hier wil ik alleen de gebruiksmethode uitleggen.
# intern 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)
Voordelen van deze methode:
- Voorwaardelijke verwerking met een betekenisvolle naam zoals PostStatus.DRAFT
- Volledige ondersteuning voor get_status_display()
- Kan als een object worden behandeld, wat handig is voor IDE-automatische aanvulling en statische analyse
if post.status == PostStatus.DRAFT:
...
- Herbruikbaarheid: Als je dezelfde keuzes in meerdere modellen wilt delen, kun je dit definiëren in een extern bestand (
choices.py
)
Feitelijk is herbruikbaarheid het grootste voordeel dat ik zie in het gebruik van deze TextChoice
-klasse.
Als het gaat om keuzes die in meerdere apps van Django worden gebruikt, kan je ze in commons/choices.py
zetten, zodat ze in elke app opnieuw kunnen worden gebruikt.
3. Conclusie
Django's TextChoices
is een geweldige functie die je helpt om modelkeuzes op een intuitieve en robuuste manier te behandelen.
Verlaat de traditionele tuples-lijstmethode en til de kwaliteit van je code naar een hoger niveau!
댓글이 없습니다.