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 ?
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 :
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 :
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
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!