Heim >Backend-Entwicklung >Python-Tutorial >Wie weist man Fremdschlüssel in verschachtelten Serialisierern mit dem Django REST Framework zu?

Wie weist man Fremdschlüssel in verschachtelten Serialisierern mit dem Django REST Framework zu?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-11 20:52:02790Durchsuche

How to Assign Foreign Keys in Nested Serializers with Django REST Framework?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn