如何在Django REST中处理当前记录页?

2024-04-18 12:44:26 发布

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

我有一个观点,将记录分页(每页10个),如下所示:

class Foo(models.Model):
    bar = models.BooleanField(db_index=True)
    user = models.ForeignKey(User, db_index=True, editable=False)
    baz = models.CharField(max_length=120)
    created = models.DateTimeField(db_index=True, auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username')

class FooSerializer(ModelSerializer):
    user = UserSerializer()
    class Meta:
        model = Foo

class FooPagination(PageNumberPagination):
    page_size = 10

class FooView(ListAPIView):
    serializer_class = FooSerializer
    pagination_class = FooPagination
    def get_queryset(self):
        user = self.request.user
        '''        
        Do something here (or when page is requested) with each record on
        the current page.
        '''
        return Foo.objects.filter(bar=true, user=user).order_by('created')

如何处理仅在当前页上的Foo记录?你知道吗


Tags: trueautodbindexfoomodels记录page
1条回答
网友
1楼 · 发布于 2024-04-18 12:44:26

也许有更好的解决方案,但我必须在查询集过滤和分页之后,但在序列化之前,推出自己的视图类来进行后期处理:

class DecoratedListModelMixin(object):
    """
    Apply a decorator to the list view before serializing
    """
    def list(self, request, *args, **kwargs):
        has_decorator = (hasattr(self, 'decorator') and self.decorator is not None)

        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)

        if page is not None:

            if has_decorator:
                serializer = self.get_serializer(self.decorator(page, request), many=True)
            else:
                serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        if has_decorator:
            serializer = self.get_serializer(self.decorator(queryset, request), many=True)
        else:
            serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

class DecoratedListAPIView(DecoratedListModelMixin, generics.GenericAPIView):
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

用法:

class FooView(DecoratedListAPIView):
    serializer_class = FooSerializer
    pagination_class = FooPagination
    decorator = foo_decorator
    def get_queryset(self):
        user = self.request.user
        return Foo.objects.filter(bar=true, user=user).order_by('created')

# queryset contains current page only
def foo_decorator(view, queryset, request):
    for foo in queryset:
        #...
    return queryset

相关问题 更多 >