在Django中,如果我在分页之前查询所有的数据库有什么用?

问题描述 投票:0回答:1

根据下面的代码,我正在做数据库的查询,然后我正在对查询结果进行分页,所以我的问题是,如果我们在分页之前已经查询了所有数据库的结果,那有什么用呢?这是Django的分页功能,还是我装错了?我得到了预期的响应,但是在分页之前查询数据库有问题。

代码如下

class GetAllUserStoryListViewTest(APIView,LimitOffsetPagination):

    permission_classes = (IsAuthenticated,)


    def get_object(self,user_id):
        user = User.objects.filter(id = user_id).first()
        posts = Post.objects.filter(user = user)
        return posts

    def get(self,request,user_id):
        posts = self.get_object(user_id).order_by('-post_time_stamp')

        #setting the limit of this user post pagination
        LimitOffsetPagination.default_limit = settings.PAGE_SIZE
        posts = self.paginate_queryset(posts, request)
        serializer_context = {
            'request': request,
        }
        serializer = PostListSerializer(posts,many=True,context=serializer_context)
        # return Response(serializer.data)
        return self.get_paginated_response(serializer.data)

输出:

{
    "count": 7,
    "next": "http://127.0.0.1:8000/api/list_all_story_test/27/?limit=2&offset=5",
    "previous": "http://127.0.0.1:8000/api/list_all_story_test/27/?limit=2&offset=1",
    "results": [
        {
            "id": 15,
            "file": "http://127.0.0.1:8000/media/user_27/post/IMG_20190331_144024.jpg",
            "post_info": "#cool",
            "post_time_stamp": "2020-05-10T10:21:10Z",
            "total_comment": 2,
            "liked_by": [
                "vipin"
            ],
            "user": {
                "id": 27,
                "username": "vipin",
                "email": "[email protected]",
                "status": true,
                "profile": {
                    "id": 24,
                    "full_name": "Vipin",
                    "mobile": 6732,
                    "background_picture": "http://127.0.0.1:8000/media/user_27/profile/pexels-photo-531880_0qSgRNx.jpeg",
                    "profile_picture": "http://127.0.0.1:8000/media/user_27/profile/IMG_20190331_144024.jpg",
                    "BioDescription": "xyz",
                    "date_of_birth": "1996-06-01",
                    "gender": "M",
                    "account_type": "Private",
                    "user": 27
                },
                "last_login": null,
                "is_superuser": false,
                "is_staff": false,
                "is_active": true,
                "date_joined": "2020-04-28T11:09:27.691478Z"
            },
            "comment_usr": [
                "xyz",
                26,
                "Cool Pic"
            ],
            "like_by_you": true
        },
        {
            "id": 13,
            "file": "http://127.0.0.1:8000/media/user_30/post/IMG_20190402_102248.jpg",
            "post_info": "#Awesome",
            "post_time_stamp": "2020-05-10T10:20:22Z",
            "total_comment": 8,
            "user": {
                "id": 30,
                "username": "xyz",
                "email": "[email protected]",
                "status": false,
                "profile": {
                    "id": 27,
                    "full_name": "XYZ",
                    "mobile": 123,
                    "background_picture": null,
                    "profile_picture": "http://127.0.0.1:8000/media/user_30/profile/demo.jpg",
                    "BioDescription": null,
                    "date_of_birth": null,
                    "gender": "F",
                    "account_type": "Private",
                    "user": 30
                },
                "last_login": null,
                "is_superuser": false,
                "is_staff": false,
                "is_active": true,
                "date_joined": "2020-04-28T11:13:58.030941Z"
            },
            "like_by_you": true
        }
    ]
}
django django-rest-framework pagination query-optimization django-orm
1个回答
0
投票

分页打数据库与 Count() 方法,到分页的结果。

而且,在每一个页面打数据库的时候,通过分片的方式,是比

使用带有 all() 方法,并且,用 Iteration,加载所有结果。

filter()all() 方法不打数据库。请看 这个 以检查何时 QuerySet 是评估。

© www.soinside.com 2019 - 2024. All rights reserved.