Affectation de clés étrangères avec des sérialiseurs imbriqués dans Django REST Framework
Django REST Framework (DRF) fournit un moyen pratique de gérer les relations de clés étrangères dans données sérialisées. Cependant, obtenir le comportement souhaité dans les sérialiseurs imbriqués peut être difficile.
Affectation de clé étrangère dans les sérialiseurs imbriqués
Les sérialiseurs imbriqués héritent du comportement de leurs sérialiseurs parents. Par défaut, ils ne permettent pas l'affectation ou la modification directe des clés étrangères. Pour surmonter ce problème, une approche courante consiste à spécifier un champ supplémentaire pour l'ID de la clé étrangère. Cependant, cela peut conduire à un développement front-end ambigu.
Solutions alternatives
1. Méthode to_representation() personnalisée :
Une solution consiste à remplacer la méthode to_representation() du sérialiseur parent. Cela permet l'inclusion de données personnalisées dans la réponse sérialisée.
def to_representation(self, instance): response = super().to_representation(instance) response['child'] = ChildSerializer(instance.child).data return response
Cette approche garantit que la clé étrangère est représentée comme un objet sérialiseur imbriqué, permettant à la fois la création et la lecture à l'aide de la même clé.
2. RelatedFieldAlternative Field :
Une solution plus générique consiste à créer un champ de sérialiseur personnalisé qui se comporte différemment du PrimaryKeyRelatedField par défaut.
class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField): def to_representation(self, instance): if self.serializer: return self.serializer(instance, context=self.context).data return super().to_representation(instance)
Ce champ permet de spécifier un sérialiseur pour la représentation de la clé étrangère.
Utilisation du champ RelatedFieldAlternative
Le champ RelatedFieldAlternative peut ensuite être utilisé dans le sérialiseur parent comme suit :
class ParentSerializer(ModelSerializer): child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer)
Avantages de l'utilisation du champ personnalisé
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3