2016-07-27 31 views
0

Djangoには次のモデルがあります。Django RESTフレームワーク:複数の関係を使ってシリアライズ

私はDjango REST Frameworkを使用して、HostStrainモデルを次のようにシリアル化しようとしています。

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

しかし、ジャンゴでの標準的な二重アンダースコア記法私はエラーを取得するので、ここで働いていないよう:

Field name strain_species__species_genus is not valid for model HostStrain .

を私がする(あるいは少なくとも、リンクを含めるしたいのですが__unicode__から)Genus私のHostStrainシリアル化のモデル。

Django REST Frameworkのシリアル化では、どのように複数レベルの関係に従うのですか?

答えて

1

これを行う方法はいくつかあります。

あなたの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') 

この方法であなたのシリアライザを他のシリアライザを含めることができますが、このような何かを出力します:

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

あなたがこれを行うことができます別の方法は、上のフィールドを作成することですあなたのHostStrainSerializerは、他のモデルから情報を取得します。

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') 

はまた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

第2の方法は、私が後だったし、ちょうど完全ドキュメントで 'source'パラメータを逃したものを基本的に使用することができます。ありがとう! –

関連する問題