Heim >Backend-Entwicklung >Python-Tutorial >Wie vereinfacht man die Zuweisung von Fremdschlüsseln in Serialisierern des Nested Django REST Framework?

Wie vereinfacht man die Zuweisung von Fremdschlüsseln in Serialisierern des Nested Django REST Framework?

Barbara Streisand
Barbara StreisandOriginal
2024-12-09 18:58:19947Durchsuche

How to Simplify Foreign Key Assignment in Nested Django REST Framework Serializers?

DRF: Vereinfachte Fremdschlüsselzuweisung in verschachtelten Serialisierern

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:

Überschreiben der to_representation()-Methode

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:

  • Keine separaten Felder zum Erstellen und Lesen erforderlich.
  • Sowohl das Erstellen als auch das Lesen können mit demselben Schlüssel erfolgen.

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

Verwendet ein benutzerdefiniertes Serialisierungsfeld

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!

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