2016-07-27 2 views
0

을 통해 직렬화, 나는 다음과 같은 모델을 가지고있다.장고 REST 프레임 워크 : 장고에 여러 관계

class Genus(models.Model): 
    genus_name=models.CharField(max_length=30) 
    ... 

class HostSpecies(models.Model): 
    species_genus=models.ForeignKey(Genus) 
    ... 

class HostStrain(models.Model): 
    strain_species=models.ForeignKey(HostSpecies) 
    strain_name=models.CharField(max_length=50) 
    ... 

이제 Django REST Framework를 사용하여 다음과 같이 HostStrain 모델을 직렬화하려고합니다.

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

그러나 장고의 표준 이중 밑줄 표시는 I 오류 얻을 수 있기 때문에, 여기에 작동하지 않는 것 : 적어도

Field name strain_species__species_genus is not valid for model HostStrain .

나는에 대한 링크를 포함하려면을 (또는 __unicode__에서) 내 HostStrain 직렬화의 Genus 모델.

그래서 내가 어떻게 장고 REST 프레임 워크의 직렬화의 멀티 레벨 관계에 따라합니까?

답변

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

두 번째 방법은 내가 후에, 그리고 단지 완전히 문서에서'source' 매개 변수를 놓친 무엇을 기본적으로 사용할 수 있습니다. 감사! –

관련 문제