gpt4 book ai didi

django - Django REST Framework 中的分页关系?

转载 作者:行者123 更新时间:2023-12-03 02:28:14 24 4
gpt4 key购买 nike

我们正在为 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 是否为此提供任何特定功能或模式?或者有什么解决办法吗?

最佳答案

自 DRF 3.1 起,不支持 PaginationSerializer。这是解决方案。

<小时/>

settings.py

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5
}
<小时/>

serializers.py

from myapp.models import Album, Track
from rest_framework import pagination, serializers

class AlbumSerializer(serializers.HyperlinkedModelSerializer):
tracks = serializers.SerializerMethodField('paginated_tracks')

class Meta:
model = Album

def paginated_tracks(self, obj):
tracks = Track.objects.filter(album=obj)
paginator = pagination.PageNumberPagination()
page = paginator.paginate_queryset(tracks, self.context['request'])
serializer = TrackSerializer(page, many=True, context={'request': self.context['request']})
return serializer.data

class TrackSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Track

或者您可以用 def pagination_tracks 替换

from rest_framework.settings import api_settings

def get_paginated_tracks(self, obj):
tracks = Track.objects.filter(album=obj)[:api_settings.PAGE_SIZE]
serializer = TrackSerializer(tracks, many=True, context={'request': self.context['request']})
return serializer.data

它甚至比上面少了一个查询。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com