Django Rest Framework:如何在序列化器响应中包含链接资源?

时间:2016-09-28 17:08:10

标签: python django django-rest-framework

如果编写我自己的ViewSet实现,并且我想返回一些对象,那很简单:

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 )

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:1)

您正在寻找的是nested relations。这是内置于Django REST Framework中的。通过在序列化程序中明确定义关系字段,您可以指定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},
        ...
    ],
}