【发布时间】:2021-08-16 11:50:34
【问题描述】:
我构建了一个简单的社交媒体应用程序。用户可以发布两种类型的帖子博客和轮播。用户可以关注其他用户,关注后可以看到其他用户的帖子。
因此,在实现主页 API 时(主页包含您关注的人的博客和轮播帖子),我像这样过滤掉博客和轮播。
blogposts = BlogPost.objects.filter(
Q(author__profile__in=request.user.profile.followings.all())
| Q(author=request.user)
)
carouselposts = Carousel.objects.filter(
Q(author__profile__in=request.user.profile.followings.all())
| Q(author=request.user)
)
它基本上会过滤您关注的人的所有博客和轮播,并在应用合适的序列化程序后将其返回。
但问题是当页面加载时,如果用户在他的主页中有 100 个帖子,所有这些帖子都会一次加载。相反,我只在开始时加载 10 个最近的帖子,并在用户到达主页底部时继续加载接下来的 10 个最近的帖子。
由于这里有两个表 Blogpost 和 Carousel 我不知道如何分页。
另外,还有一个问题?如果我以某种方式将此内容分页以一次发送 10 个最近的帖子,它会在每个请求中仅在内部查询 10 个帖子,还是会一次查询所有 100 个帖子并以 10 个为一组发送?
这是主页API的完整代码。
class HomepageBlogPostView(APIView):
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
blogposts = BlogPost.objects.filter(
Q(author__profile__in=request.user.profile.followings.all())
| Q(author=request.user)
)
posts_list_serializer = BlogPostSerializer(
blogposts, many=True, context={"request": request}
)
carouselposts = Carousel.objects.filter(
Q(author__profile__in=request.user.profile.followings.all())
| Q(author=request.user)
)
carousels_list_serializer = CarouselSerializer(
carouselposts, many=True, context={"request": request}
)
blogposts_list = list(posts_list_serializer.data)
carousels_list = list(carousels_list_serializer.data)
blogposts_list.extend(carousels_list)
posts = blogposts_list
posts.sort(key=lambda post: -post["published"])
return Response(posts, status=status.HTTP_200_OK)
【问题讨论】:
-
所以你想对博客和轮播的组合进行分页,对吧?它将使用哪种排序方式?还是您想获得博客的前 10 个和轮播的前 10 个并返回 20 个项目?
标签: python django django-rest-framework