Heim >Backend-Entwicklung >Python-Tutorial >Wie weist man Fremdschlüssel in verschachtelten Serialisierern mit dem Django REST Framework zu?
DRF: Einfache Fremdschlüsselzuweisung mit verschachtelten Serialisierern
Im Django REST Framework ermöglicht ein Standard-ModelSerializer die Zuweisung oder Änderung von ForeignKey-Modellbeziehungen über Eine ID als Ganzzahl posten. Allerdings kann es eine Herausforderung sein, dieses Verhalten aus einem verschachtelten Serialisierer zu extrahieren.
Einfachster Ansatz für verschachtelte Serialisierer
DRF bietet diese Funktionalität nicht von Natur aus, sodass ein benutzerdefiniertes Serialisiererfeld erforderlich ist :
from rest_framework import serializers class RelatedFieldAlternative(serializers.PrimaryKeyRelatedField): def __init__(self, **kwargs): # Serializer for this field 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): # Avoid using PK optimization if a serializer is provided return False if self.serializer else True def to_representation(self, instance): # Use provided serializer or default representation if self.serializer: return self.serializer(instance, context=self.context).data return super().to_representation(instance)
Verwenden Sie dieses neue Feld in Ihrem übergeordneten Serialisierer wie folgt:
class ParentSerializer(ModelSerializer): child = RelatedFieldAlternative(queryset=Child.objects.all(), serializer=ChildSerializer) class Meta: model = Parent fields = '__all__'
Mit diesem generischen Ansatz können Sie problemlos mehrere Serialisierer mit dieser Funktionalität verwalten.
Methode zum Überschreiben von to_representation()
Alternativ kann dieses Ziel auch durch Überschreiben der to_representation()-Methode des übergeordneten Serialisierers erreicht werden:
class ParentSerializer(ModelSerializer): def to_representation(self, instance): response = super().to_representation(instance) response['child'] = ChildSerializer(instance.child).data return response
Diese Methode muss definiert werden verschiedene Bereiche zum Erstellen und Lesen, die möglicherweise nicht ideal sind.
Das obige ist der detaillierte Inhalt vonWie weist man Fremdschlüssel in verschachtelten Serialisierern mit dem Django REST Framework zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!