[PYTHON] Utilisez des modèles d'utils.

model_utils.Choices

Django, utilisateurs DRF Utilisez-vous model_utils.Choices? Nous l'utilisons de manière pratique, mais nous l'utilisons souvent pour la gestion des statuts.

C'est comme ça?

class News(models.Model):
    STATUS = Choices(
        ('DRAFT',     'Brouillon'),
        ('CHECK',     'En attente d'une revue'),
        ('PUBLISHED', 'Libération'),
    )

    status = StatusField(
        choices_name='STATUS',
        help_text="Statut",
        default=STATUS.DRAFT,
    )

    title = models.CharField(
        max_length=1024,
        null=False,
        blank=False,
        default="",
        help_text="Titre de l'actualité"
    )

    body = models.TextField(
        null=False,
        blank=False,
        default="",
        help_text="Détails de l'actualité"
    )

À quoi sert l'explication (VALUE) de Choice?

Dans Choice, vous pouvez définir KEY et sa description (KEY est stocké dans DB), mais je ne sais pas comment utiliser cette description. N'est-il pas acceptable de commenter? Je me sens comme. De plus, si ce champ Choice est sorti tel quel avec Serializer, seule KEY est sortie, il n'y a donc aucun moyen d'utiliser l'explication (VALUE).

Comment utiliser VALUE

Par exemple, dans l'exemple de ↑, s'il existe un écran de gestion qui gère les actualités, vous pouvez souhaiter afficher l'état dans la liste ou rechercher par état. Sur cet écran, vous voulez utiliser «Brouillon» ou «Public» au lieu de «DRAFT» ou «PUBLISHED».

Dans de tels moments, il semble stupide d'implémenter chaque programmeur pour renvoyer KEY et VALUE dans la sérialisation de sortie de Choice, donc nous créons et exploitons une telle extension.

class MyChoiceField(serializers.ChoiceField):
    def to_representation(self, obj):
        choice = getattr(self, '_choices')
        key = str(obj)
        if key in choice:
            return {'key': key, 'val': choice[key]}
        else:
            return {'key': key, 'val': ''}


class MyModelSerializer(serializers.ModelSerializer):
    """
Réécrire les champs qui sont automatiquement développés dans le sérialiseur
    """
    serializer_choice_field = MyChoiceField

Chaque sérialiseur hérite de MyModelSerializer.

class NewsSerializer(MyModelSerializer):
    class Meta:
        model = News
        fields = "__all__"

Maintenant, status affichera la clé et la valeur.

Recommended Posts

Utilisez des modèles d'utils.
Utilisez prefetch_related commodément avec Django
Pandas / DataFrame Conseils pour une utilisation pratique