101 votes

Spécifier un ENUM mySQL dans un modèle Django

Comment procéder pour spécifier et utiliser un ENUM dans un modèle Django ?

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.

6voto

Charles Merriam Points 4498

Si vous voulez vraiment utiliser le type ENUM de vos bases de données :

  1. Utiliser Django 1.x
  2. Reconnaissez que votre application ne fonctionnera que sur certaines bases de données.
  3. Parcourez cette page de documentation : http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields

Bonne chance !

3voto

Pureferret Points 747

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 :

  1. 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.
  2. 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.

3voto

Cesar Canassa Points 3579

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")
        ]

-2voto

Kenzo Points 800

En haut de votre fichier models.py, ajoutez cette ligne après avoir effectué vos importations :

    enum = lambda *l: [(s,_(s)) for s in l]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X