2016-09-28 20 views
0

ViewSetの私自身の実装を作成し、私はいくつかのオブジェクトを返すようにしたい、それはかなりシンプルだ場合:Django Rest Framework:リンクされたリソースをシリアライザのレスポンスに含めるにはどうすればよいですか?

class MyViewSet(ViewSet): 
    def my_method(self, request): 
    objects = MyModel.objects.all() 
    return Response(MyModelSerializer(objects, many=True).data) 

しかし、のは、私はForeignKeyによって別のリンクされたリソースの実際のインスタンスを含めたいとしましょう、の代わりにIDを指定します。例:

class MyModel(Model): 
    author = ForeignKey(MyOtherModel) 
    ... 

このような方法がありますか?

... 
return Response(MyModelSerializer(objects, many=True, include='author').data) 

答えて

1

あなたが探しているのはnested relationsです。これはDjango RESTフレームワークに組み込まれています。シリアライザでリレーションフィールドを明示的に定義することにより、関連するオブジェクトを展開するmany=Trueを指定することができます。この例から

http://www.django-rest-framework.org/api-guide/relations/#example

class TrackSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Track 
     fields = ('order', 'title', 'duration') 

class AlbumSerializer(serializers.ModelSerializer): 
    tracks = TrackSerializer(many=True, read_only=True) 

    class Meta: 
     model = Album 
     fields = ('album_name', 'artist', 'tracks') 

これは戻すことができます

{ 
    'album_name': 'The Grey Album', 
    'artist': 'Danger Mouse', 
    'tracks': [ 
     {'order': 1, 'title': 'Public Service Announcement', 'duration': 245}, 
     {'order': 2, 'title': 'What More Can I Say', 'duration': 264}, 
     {'order': 3, 'title': 'Encore', 'duration': 159}, 
     ... 
    ], 
} 
1

シリアライザでdepthメタ属性を使用できます。

class AccountSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Account 
     fields = ('id', 'account_name', 'users', 'created') 
     depth = 1 

フィールドを明示的に指定して、それらのシリアル化方法を制御します。

class AccountSerializer(serializers.ModelSerializer): 
    url = serializers.CharField(source='get_absolute_url', read_only=True) 
    groups = serializers.PrimaryKeyRelatedField(many=True) 

    class Meta: 
     model = Account 
関連する問題