Comment procéder pour spécifier et utiliser un ENUM dans un modèle Django ?
Réponses
Trop de publicités?Si vous voulez vraiment utiliser le type ENUM de vos bases de données :
- Utiliser Django 1.x
- Reconnaissez que votre application ne fonctionnera que sur certaines bases de données.
- Parcourez cette page de documentation : http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields
Bonne chance !
Il y a actuellement deux projets github basés sur l'ajout de ces éléments, bien que je n'aie pas cherché à savoir exactement comment ils sont mis en œuvre :
-
Django-EnumField :
Fournit un champ de modèle Django d'énumération (utilisant IntegerField) avec des énumérations réutilisables et une validation de transition. -
Django-EnumFields :
Ce paquetage vous permet d'utiliser de vrais enums Python (style PEP435) avec Django.
Je ne pense pas que l'un ou l'autre utilise les types DB enum, mais ils sont en cours de réalisation pour le premier.
Django 3.0 a un support intégré pour les Enums.
Desde el documentation :
from django.utils.translation import gettext_lazy as _
class Student(models.Model):
class YearInSchool(models.TextChoices):
FRESHMAN = 'FR', _('Freshman')
SOPHOMORE = 'SO', _('Sophomore')
JUNIOR = 'JR', _('Junior')
SENIOR = 'SR', _('Senior')
GRADUATE = 'GR', _('Graduate')
year_in_school = models.CharField(
max_length=2,
choices=YearInSchool.choices,
default=YearInSchool.FRESHMAN,
)
Maintenant, sachez que il n'impose pas les choix au niveau de la base de données. il s'agit de la seule construction Python. Si vous souhaitez également faire respecter ces valeurs dans la base de données, vous pouvez combiner cela avec des contraintes de base de données :
class Student(models.Model):
...
class Meta:
constraints = [
CheckConstraint(
check=Q(year_in_school__in=YearInSchool.values),
name="valid_year_in_school")
]
- Réponses précédentes
- Plus de réponses
4 votes
Steve, si vous voulez dire utiliser le type ENUM de MySQL, alors vous n'avez pas de chance, pour autant que je sache Django ne fournit pas de support pour cela (cette fonctionnalité n'est pas disponible dans toutes les bases de données supportées par Django). La réponse fournie par Paul fonctionne, mais elle ne le fera pas définir le type dans la BD.