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
Freigeben: 2024-12-09 18:58:19
Original
943 Leute haben es durchsucht

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
Nach dem Login kopieren

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)
Nach dem Login kopieren

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__'
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage