Publicado originalmente en melvinkoh.me .
En la documentación oficial de Django, brindan 2 ejemplos sobre cómo usar opciones predefinidas como opciones de un campo en particular.
El primer ejemplo define las opciones como una Tupla de Tupla, siendo cada opción el valor de la tupla exterior.
El primer elemento de cada tupla interna es el valor que se establecerá en el modelo, y el segundo elemento es su representación de cadena.
# Example from Django official documentationYEAR_IN_SCHOOL_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'),)
En su segundo ejemplo, nos sugieren que definamos las opciones como constantes en nuestra clase modelo.
# Example from Django official documentationfrom django.db import models class Student(models.Model): # Constants in Model class FRESHMAN = 'FR' SOPHOMORE = 'SO' JUNIOR = 'JR' SENIOR = 'SR' YEAR_IN_SCHOOL_CHOICES = ( (FRESHMAN, 'Freshman'), (SOPHOMORE, 'Sophomore'), (JUNIOR, 'Junior'), (SENIOR, 'Senior'), ) year_in_school = models.CharField( max_length=2, choices=YEAR_IN_SCHOOL_CHOICES, default=FRESHMAN, )
Hay una tercera opción que es mi forma preferida de definir opciones para un campo en el modelo: enumeración (o enumeración)
La enumeración es un conjunto de nombres simbólicos vinculados a valores constantes únicos. Definiremos nuestros Enums como una subclase de enum en la biblioteca estándar de Python. enumeración en la documentación oficial de Python
En esta publicación, lo guiaré a través del uso de Enum como opciones de campo con un ejemplo simple. Supongamos que hay un campo para identificar el idioma de un libro, las opciones de idioma dadas son inglés, alemán, español y chino.
Primero, definimos una clase para todas las opciones:
from enum import Enum class LanguageChoice(Enum): # A subclass of Enum DE = "German" EN = "English" CN = "Chinese" ES = "Spanish"
A continuación, definimos nuestro modelo:
from django.db import models class Book(models.Model): title = models.CharField(max_length=255) language = models.CharField( max_length=5, choices=[(tag, tag.value) for tag in LanguageChoice] # Choices is a list of Tuple )
En nuestro modelo de libro , las opciones del campo de idioma son una lista de tuplas. Para simplificar, usamos la comprensión de listas para generar nuestra lista de opciones.
Para cada tupla de opciones, el primer elemento es el valor que se almacena en el modelo, mientras que el segundo es su representación legible por humanos.
Ahora que hemos definido nuestro Enums y modelo, ¿cómo lo usaríamos?
Digamos que queremos agregar una entrada de libro con el idioma 'DE':
# import your Models and Enums b = Book(title='Deutsch Für Ausländer', language=LanguageChoice.DE)b.save()
Tenga en cuenta que la forma en que proporcionamos el valor para el idioma del parámetro depende del primer elemento que definimos en las tuplas de la lista de opciones. Usamos (etiqueta, etiqueta.valor) cuya etiqueta es de tipo Enum.
Puede preguntar: "¿Por qué usar Enum en lugar de los ejemplos dados en la documentación oficial de Django?"
De acuerdo con PEP 435 , una enumeración es útil para definir un conjunto inmutable y relacionado de valores constantes que pueden o no tener un significado semántico. Los ejemplos clásicos son los días de la semana (de domingo a sábado) y las calificaciones de las evaluaciones escolares ('A' a 'D' y 'F'). Otros ejemplos incluyen valores de estado de error y estados dentro de un proceso definido.
Tu aplauso definitivamente me llevará más lejos. Dame un aplauso si te gusta este post.