Heim >Backend-Entwicklung >Python-Tutorial >Wie vereinfacht man die Zuweisung von Fremdschlüsseln in Serialisierern des Nested Django REST Framework?
Problem:
Mit Django REST Framework (DRF), a Mit dem Standard-ModelSerializer können ForeignKey-Modellbeziehungen zugewiesen oder bearbeitet werden, indem eine ID als Ganzzahl angegeben wird. Bei der Arbeit mit verschachtelten Serialisierern wirft die Replikation dieses Verhaltens jedoch Zweifel an der besten Vorgehensweise auf.
Lösung:
Eins Die Methode zum Erreichen dieser Funktionalität in einem verschachtelten Serialisierer besteht darin, die Methode to_representation() im übergeordneten Serialisierer zu überschreiben. Diese Technik hat folgende Vorteile:
Beispiel für einen übergeordneten Serializer mit der Methode „Modified to_representation()“:
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
Für eine allgemeinere Lösung sollten Sie die Erstellung eines benutzerdefinierten Serialisierungsfelds namens „RelatedFieldAlternative“ in Betracht ziehen. Dieses Feld stellt die Kompatibilität mit den DRF-Versionen 3.x und 4.x sicher.
Benutzerdefiniertes Serialisierungsfeld:
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)
Verwendung des benutzerdefinierten Felds im übergeordneten Feld Serialisierer:
class ParentSerializer(ModelSerializer): child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer) class Meta: model = Parent fields = '__all__'
Das obige ist der detaillierte Inhalt vonWie vereinfacht man die Zuweisung von Fremdschlüsseln in Serialisierern des Nested Django REST Framework?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!