django restful api-如何序列化外键

django restful api-如何序列化外键,django,django-rest-framework,Django,Django Rest Framework,我正在使用Django1.8,djangorestframework==3.6.3。 我从文档中选取了模型示例: 以下是我的序列化程序: from rest_framework import serializers from .models import * class AlbumSerializer(serializers.ModelSerializer): tracks = serializers.StringRelatedField(many=True) class

我正在使用Django1.8,djangorestframework==3.6.3。 我从文档中选取了模型示例:

以下是我的序列化程序:

from rest_framework import serializers
from .models import *

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True)

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


class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration', 'album')
下面是我如何调用序列化程序:

def index(request):
    if Track.objects.all().count() == 0:
        album = Album.objects.create(album_name='something', artist='John')
        Track.objects.create(album=album, order=1, title='something', duration=1)

    print TrackSerializer(instance=Track.objects.all()[0]).data
    return render(request, 'index.html')
打印声明给了我: {'duration':1,'album':1,'order':1,'title':u'something'}
为什么它不给我相应专辑的所有字段数据?

在相应的示例中,他们用于返回
专辑的数据,而您正在尝试返回/打印
曲目的数据。

因此,如果您尝试以下操作,它将打印/返回DRF文档中描述/显示的数据

def index(request):
    if Track.objects.all().count() == 0:
        album = Album.objects.create(album_name='something', artist='John')

        print(AlbumSerializer(album).data)  # this will print the data as explianed in the doc

        Track.objects.create(album=album, order=1, title='something', duration=1)

    return render(request, 'index.html')


注意:您可以使用
AlbumSerializer
而不是
AlbumNewSerializer
,但结果可能是一种难看的嵌套方式(未经测试)

我认为您需要这样做:

class TrackSerializer(serializers.ModelSerializer):
    album = AlbumSerializer(…)

    ...
class TrackSerializer(serializers.ModelSerializer):
    album = AlbumSerializer(…)

    ...