2016-07-27 19 views
0

In Django habe ich folgende Modelle.Django REST Framework: Serialisierung durch mehrere Beziehungen

Jetzt versuche ich Django REST Framework zu verwenden, um das HostStrain-Modell wie folgt zu serialisieren.

class HostStrainSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = HostStrain 
     fields = ('strain_species__species_genus','strain_species','strain_name') 

Aber die Standard-Doppelstrich-Schreibweise in Django scheint hier nicht zu arbeiten, da ich den Fehler:

Field name strain_species__species_genus is not valid for model HostStrain .

Ich möchte einen Link zu (oder zumindest enthalten die __unicode__ von) Genus Modell in meiner HostStrain Serialisierung.

Wie kann ich mehrstufige Beziehungen in der Serialisierung von Django REST Framework verfolgen?

Antwort

1

Es gibt ein paar Möglichkeiten, wie Sie dies tun können.

können Sie auch andere Serializer auf HostStrainSerializer

class GenusSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Genus 
     fields = ('genus_name') 

class HostSpeciesSerializer(serializers.HyperlinkedModelSerializer): 
    species_genus = GenusSerializer() 

    class Meta: 
     model = HostSpecies 
     fields = ('species_genus') 

class HostStrainSerializer(serializers.HyperlinkedModelSerializer): 
    strain_species = HostSpeciesSerializer() 

    class Meta: 
     model = HostStrain 
     fields = ('strain_species','strain_name') 

Auf diese Weise Ihre Serializer ausgegeben etwas wie folgt aus:

{ 
    "strain_name": "...", 
    "strain_species": { 
     "species_genus": { 
      "genus_name": "..." 
     } 
    } 
} 

Ein anderer Weg, dies zu tun ist Felder erstellen Ihre HostStrainSerializer, die die Informationen von den anderen Modellen bekommt.

class HostStrainSerializer(serializers.HyperlinkedModelSerializer): 
    strain_species = HostSpeciesSerializer() 
    species_genus = serializers.ReadOnlyField(source='strain_species.species_genus.genus_name') 

    class Meta: 
     model = HostStrain 
     fields = ('species_genus', 'strain_species','strain_name') 

Sie können auch eine SerializerMethodField

class HostStrainSerializer(serializers.HyperlinkedModelSerializer): 
    strain_species = HostSpeciesSerializer() 
    species_genus = serializers.SerializerMethodField() 

    def get_species_genus(self, instance): 
     return instance.strain_species.species_genus.genus_name 

    class Meta: 
     model = HostStrain 
     fields = ('species_genus', 'strain_species','strain_name') 
+0

Die zweite Methode ist im Grunde, was ich nach, verwenden und nur knapp verfehlt völlig die 'source' Parameter in der Dokumentation. Vielen Dank! –