Django-Rest-Fram中基于过滤结果的分页

2024-10-02 00:25:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在get函数中有一个简单的过滤,它需要分页。我试过不同的方法来解决这个问题,但我不知道到底需要做些什么。下面是我的代码

class UserInfoViewSets(viewsets.ViewSet):

    def UserInfo_post(self,request, format=None):
        if request.method == 'POST':
            serializer = UserInfoSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def UserInfo_get(self,request,user_token):  
        if request.method == 'GET':
            queryset = UserInfo.objects.filter(user_token=user_token)
            serializer = UserInfoSerializer(queryset,many=True)

我需要对get结果进行分页。我不想编写自定义的分页类,只需设置参数以限制每页的结果数。我试着在设置.py文件

^{pr2}$

在我的视图文件中,我添加了ListAPIView

class UserInfoListView(generics.ListAPIView):
    model = UserInfo
    serializer_class = UserInfoSerializer
    paginate_by_param = 'limit'

显然我忽略了一些小细节。我试着去侦察了想文件。但它似乎是面向那些精通django的人。在


Tags: 文件selftokendatagetifrequestdef
3条回答

谢谢@umut和@prashant。我用DRF分享我的版本。希望其他刚接触drf的人会发现这更容易。在

def Users_get(self,request,user_token): 
        if request.method == 'GET':
            queryset = Users.objects.filter(user_token=user_token)
            paginator = PageNumberPagination()
            result_page = paginator.paginate_queryset(queryset, request)
            serializer = UsersSerializer(result_page,many=True)
            return paginator.get_paginated_response(serializer.data)

这给了我下一个和上一个url链接的响应。在

在下面的代码中,整个视图集被设计成GET POST PUT DELETE还可以处理关于分页过滤查询的查询。 分页是使用Paginator完成的,它是django中的一个内置程序

对于包含大部分内容的文档,请访问django docs。DRF文档有时会令人困惑,但django文档描述得很好,而且易于实现

views.py

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
@api_view(['GET', 'POST'])
def product_list(request):
    if request.method == 'GET':
        products = Product.objects.all()
        product_make_up = Product.objects.filter(item_category__exact='Make Up')[:3]
        product_skincare = Product.objects.filter(item_category__exact='Skin Care')[:3]
        product_fragrance = Product.objects.filter(item_category__exact='Fragrance')[:3]
        product_personal_care = Product.objects.filter(item_category__exact='Personal Care')[:3]
        product_hair_care = Product.objects.filter(item_category__exact='Hair Care')[:3]
        product_item_category = QuerySetChain(product_make_up,
                                          product_skincare,
                                          product_fragrance,
                                          product_personal_care,
                                          product_hair_care)
        item_cates = request.query_params.get('item_category',None)
        if item_cates is not None:
             product = products.filter(item_category=item_cates)
             paginator = Paginator(product,5)
             page = request.query_params.get('page')
             product = paginator.page(page)
             try:
                 product = paginator.page(page)
             except PageNotAnInteger:
                 product = paginator.page(1)
             except EmptyPage:
                 product = pagintor.page(paginator.num_pages)
                 serializer = ProductSerializer(product, many=True)
    else:
        paginator = Paginator(product_item_category,15)
        page = request.query_params.get('page')
        product_item_category = paginator.page(page)
        try:
            product_item_category = paginator.page(page)
        except PageNotAnInteger:
            product_item_category = paginator.page(1)
        except EmptyPage:
            product_item_category = pagintor.page(paginator.num_pages)
        serializer = ProductSerializer(product_item_category, many=True)    
    return Response(serializer.data)
elif request.method == 'POST':
    serializer = ProductSerializer( data=request.data)
    # data.encode("base64")
    if serializer.is_valid():
        serializer.save()
        res_msg = {'Success_Message' : 'Successful','Success_Code' : 200}
        return Response(res_msg)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


@api_view(['GET', 'PUT', 'DELETE'])
def product_detail(request, pk):
"""
Get, udpate, or delete a specific task
"""
    try:
        product = Product.objects.get(pk=pk)
    except Product.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = ProductSerializer(product)
        return Response(serializer.data , status=status.HTTP_201_CREATED)

    elif request.method == 'PUT':
        serializer = ProductSerializer(product, data=request.data)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data)
        else:
            return Response(
            serilizer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        product.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

这就是我所做的分页,过滤,排序等。。。首先需要pip install django-filterhttps://github.com/alex/django-filter

在设置.py在

REST_FRAMEWORK = {

    . . . 

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
    ),
    'PAGE_SIZE': 1000

    . . .

}

在视图.py在

^{pr2}$

我在用AngularJS

function getUserList(limit, pageNumber, search, ordering) {

    var def = $q.defer();
    offset = (pageNumber -1) * limit;
    $http.get(API_URL +
        '?limit=' +limit +
        '&offset=' + offset +
        '&search=' + search +
        '&ordering=' + ordering)

    .success(function(data){
        def.resolve(data);
    })
    .error(function(data){
        def.resolve(data);
    });

    return def.promise;
}

示例查询:

http://127.0.0.1:8000/user/?limit=10&offset=0&search=%20&ordering=id

相关问题 更多 >

    热门问题