Lfa*_*Lfa 5 python django rest pagination django-rest-framework
我已经使用Django Rest Framework构建了API。我想更改分页以获得更好的用户体验。
问题:
客户打电话要求所有帖子。该请求看起来像:
http://website.com/api/v1/posts/?page=1
Run Code Online (Sandbox Code Playgroud)
这将返回帖子的第一页。但是,总是会创建新的帖子。因此,当用户请求时:
http://website.com/api/v1/posts/?page=2
Run Code Online (Sandbox Code Playgroud)
这些帖子几乎总是与第1页相同(因为总是有新数据出现,我们正在按排序-created)。
可能的解决方案?
我的想法是随请求一起发送对象ID,以便我们在获取帖子时使用。我们针对最后一个查询抓住它们。
http://website.com/api/v1/posts/?page=2&post_id=12345
Run Code Online (Sandbox Code Playgroud)
当我们分页时,我们在哪里过滤 post_id < 12345
但这仅在我们的post_id为整数的情况下有效。
现在我目前仅使用基本 ListAPIView
class PostList(generics.ListAPIView):
"""
API endpoint that allows posts to be viewed
"""
serializer_class = serializers.PostSerializer # just a basic serializer
model = Post
Run Code Online (Sandbox Code Playgroud)
有没有更好的分页方法?这样,在创建新数据时,该用户会话的下一个请求就不会像第一个请求那样。
您正在从 DRF 文档中寻找CursorPagination:
光标分页提供以下好处:
- 提供一致的分页视图。如果使用得当,CursorPagination 可确保客户端在分页记录时永远不会看到相同的项目两次,即使在分页过程中其他客户端正在插入新项目也是如此。
- 支持使用非常大的数据集。对于非常大的数据集,使用基于偏移量的分页样式可能会变得效率低下或无法使用。相反,基于光标的分页方案具有固定时间属性,并且不会随着数据集大小的增加而减慢。
您还可以-created将其用作上面提到的排序字段。
缓存查询集怎么样?这样下一页就可以从同一个查询集提供服务,而不是从新的查询集提供服务。然后您可以在需要时使用参数来获取新的查询集。
像这样的东西:
from django.core.cache import cache
class PostList(generics.ListAPIView):
def get_queryset(self):
qs_key = str(self.request.user.id) + '_key'
if 'refresh' in self.request.QUERY_PARAMS:
# get a new query set
qs = Post.objects.all()
cache.set(qs_key, qs)
return cache.get(qs_key)
Run Code Online (Sandbox Code Playgroud)
所以基本上,只有当你的网址是这样的时候:
http://website.com/api/v1/posts/?refersh=whatever
Run Code Online (Sandbox Code Playgroud)
该请求将返回新数据。
更新
为了向每个用户提供自己的帖子集,缓存键必须包含唯一标识符(可能是用户的 ID):我还更新了代码。
这种方法的缺点是,对于大量用户以及每个用户的大量帖子,它可能效果不佳。
所以,这是我的第二个想法
Post模型使用TimeStamped模型,并根据创建的字段过滤查询集。
我不太了解您的模型以及它们的具体构建方式,所以我想您必须选择最适合您的应用程序的解决方案:)
| 归档时间: |
|
| 查看次数: |
987 次 |
| 最近记录: |