我们正在为我们的API使用Django REST Framework,我们需要对返回多个项目的关系字段进行分页。

为了演示使用类似于documentation中的示例的示例:

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

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

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


相册的序列化输出示例:

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


在专辑中有数百首曲目的地方,这将成为问题。在这种情况下,有没有办法对“曲目”进行分页?

理想情况下,我知道在这种情况下,“曲目”可能应该指向一个API URL,该URL仅返回特定专辑的曲目-这样就可以轻松分页。这种方法的缺点是,即使获得前几条音轨,也需要额外的请求(因此会产生延迟等)。就我们而言,重要的是我们能够通过对专辑API的单次请求获得至少一些曲目,然后在需要时动态加载其余曲目。

DRF是否为此提供任何特定功能或模式?还是有什么解决方法?

最佳答案

从汤姆的链接复制过来的答案,以防将来发生腐烂:

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

class PaginatedTrackSerializer(pagination.PaginationSerializer):
    class Meta:
        object_serializer_class = TrackSerializer

class AlbumSerializer(serializers.ModelSerializer):

    tracks = serializers.SerializerMethodField('paginated_tracks')


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


    def paginated_tracks(self, obj):
        paginator = Paginator(obj.tracks.all(), 10)
        tracks = paginator.page(1)

        serializer = PaginatedTrackSerializer(tracks)
        return serializer.data

关于django - Django REST Framework中的分页关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15617595/

10-12 00:13
查看更多