Maison >développement back-end >Tutoriel Python >Comment simplifier l'attribution de clés étrangères dans les sérialiseurs imbriqués du framework Django REST ?

Comment simplifier l'attribution de clés étrangères dans les sérialiseurs imbriqués du framework Django REST ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-09 18:58:19937parcourir

How to Simplify Foreign Key Assignment in Nested Django REST Framework Serializers?

DRF : affectation simplifiée de clés étrangères dans les sérialiseurs imbriqués

Problème :

Avec Django REST Framework (DRF), un ModelSerializer standard permet d'attribuer ou de modifier les relations de modèle ForeignKey en publiant un ID sous forme d'entier. Cependant, lorsque vous travaillez avec des sérialiseurs imbriqués, la réplication de ce comportement soulève des doutes sur la meilleure approche.

Solution :

Remplacer la méthode to_representation()

Une La méthode pour obtenir cette fonctionnalité dans un sérialiseur imbriqué consiste à remplacer la méthode to_representation() dans le sérialiseur parent. Cette technique présente les avantages suivants :

  • Pas besoin de champs séparés pour la création et la lecture.
  • La création et la lecture peuvent être effectuées à l'aide de la même clé.

Exemple de sérialiseur parent avec to_representation modifiée() Méthode :

class ParentSerializer(ModelSerializer):

    class Meta:
        model = Parent
        fields = '__all__'

    def to_representation(self, instance):
        response = super().to_representation(instance)
        response['child'] = ChildSerializer(instance.child).data
        return response

Utilisation d'un champ de sérialiseur personnalisé

Pour une solution plus générique, envisagez de créer un champ de sérialiseur personnalisé appelé RelatedFieldAlternative. Ce champ garantit la compatibilité avec les versions 3.x et 4.x de DRF.

Champ de sérialiseur personnalisé :

from rest_framework import serializers

class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField):

    def __init__(self, **kwargs):
        self.serializer = kwargs.pop('serializer', None)
        if self.serializer is not None and not issubclass(self.serializer, serializers.Serializer):
            raise TypeError('"serializer" is not a valid serializer class')

        super().__init__(**kwargs)

    def use_pk_only_optimization(self):
        return False if self.serializer else True

    def to_representation(self, instance):
        if self.serializer:
            return self.serializer(instance, context=self.context).data
        return super().to_representation(instance)

Utilisation du champ personnalisé dans le parent Sérialiseur :

class ParentSerializer(ModelSerializer):

    child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer)

    class Meta:
        model = Parent
        fields = '__all__'

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn