2017-07-12 17 views
0

私は3つのモデルを持っています。そのうちの1つは、他の2つをリンクする中間モデルです。私はこれらの2つのモデルを外部キーの関係で適切にネストすることができますが、この中間モデルを使用して一緒にリンクさせたいと思います。下部に希望の出力。Django Rest Framework - 中間モデルによるネストされた直列化

models.py

class Parent(models.Model): 
    first_name = models.CharField(max_length=128) 
    last_name = models.CharField(max_length=128) 


class Child(models.Model): 
    given_name = models.CharField(max_length=128) 
    # reverse relation works, but an intermediary model is preferred 
    # parent = models.ForeignKey(Parent, related_name="parents" on_delete=models.PROTECT) 


class Link(models.Model): 
    parent = models.ForeignKey(Parent, on_delete=models.PROTECT) 
    child = models.ForeignKey(Child, on_delete=models.PROTECT) 

serializers.py

class ChildSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Child 
     fields = '__all__' 


class LinkSerializer(serializers.ModelSerializer): 
    # what should I place here? 

    class Meta: 
     model = Link 
     fields = '__all__' 


class ParentSerializer(serializers.ModelSerializer): 
    children = LinkSerializer(many=True) 

    class Meta: 
     model = Parent 
     fields = ('id', 'first_name', 'last_name', 'children') 

api_output.json

{ 
    "id": 1, 
    "first_name": "John", 
    "last_name": "Appleseed", 
    "children": [ 
     { 
      "id": 1, 
      "given_name": "Uno Appleseed" 
     }, 
     { 
      "id": 2, 
      "given_name": "Dos Appleseed" 
     } 
    ] 
} 

答えて

2

SPに試してみてくださいLinkSerializerでsourseキーワードを使用して、フィールドのecifyソース:

class LinkSerializer(serializers.ModelSerializer): 
    given_name = serializers.CharField(source='child.given_name') 
    id = given_name = serializers.CharField(source='child.id') 

    class Meta: 
     model = Link 
     fields = ('given_name', 'id') 
+0

が、それは、このソリューションで各モデルフィールドの1つのシリアライザフィールドを作成するために必要ですか?つまり、 'children = ChildSerializer(source =" * "、many = True)'のような方法がありますか?すべての列を表示したいときは扱いにくいです。 – Nogurenn

+0

@Nogurennはい、各フィールドを別々に定義する必要があります。別の方法として、http://www.django-rest-framework.org/api-guide/fields/#serializermethodfieldでParentSerializerをカスタマイズしてみることもできます – neverwalkaloner

関連する問題