TextChoices предпочтительнее — даёт автодополнение и избегает магических строк.
TextChoices / IntegerChoices
from django.db import models
class Task(models.Model):
class Status(models.TextChoices):
TODO = 'todo', 'К выполнению'
IN_PROGRESS = 'in_progress', 'В процессе'
DONE = 'done', 'Выполнено'
class Priority(models.IntegerChoices):
LOW = 1, 'Низкий'
MEDIUM = 2, 'Средний'
HIGH = 3, 'Высокий'
status = models.CharField(
max_length=20,
choices=Status,
default=Status.TODO,
)
priority = models.IntegerField(
choices=Priority,
default=Priority.MEDIUM,
)
Использование choices
# Создание
task = Task.objects.create(status=Task.Status.TODO, priority=Task.Priority.HIGH)
# Фильтрация
Task.objects.filter(status=Task.Status.DONE)
# Читаемое значение
task.get_status_display() # 'К выполнению'
task.get_priority_display() # 'Высокий'
# Перебор вариантов
for value, label in Task.Status.choices:
print(value, label)
В шаблоне
<span>{{ task.get_status_display }}</span>
<select name="status">
{% for value, label in status_choices %}
<option value="{{ value }}">{{ label }}</option>
{% endfor %}
</select>
Старый стиль (без enum)
STATUS_CHOICES = [
('todo', 'К выполнению'),
('done', 'Выполнено'),
]
status = models.CharField(choices=STATUS_CHOICES, max_length=20)
TextChoices предпочтительнее — даёт автодополнение и избегает магических строк.
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!