zer*_*dge 2 django django-rest-framework
假设我需要设置几个看起来像这样的 GET 端点objects/past
,objects/future
。例子:
@action(detail=False, methods=["GET"], name="Past Objects")
def past(self, request, *args, **kwargs):
startdate = datetime.datetime.now()
some_user = UserProfile.objects.get(user__username="someuser")
queryset = self.queryset.filter(
other__attribute__profile=some_user,
creation_date__lte=startdate
).order_by("-creation_date")
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
以上工作得很好。但是有没有办法避免这个page = ... -> serializer= ...
部分?
我已经在我的 ModelViewSet 中指定了这个:
pagination_class = CustomObjectPagination
Run Code Online (Sandbox Code Playgroud)
但似乎分页仅自动应用于默认方法,get_queryset
而不是自定义操作。每次指定自定义操作时是否都必须编写此样板past
?
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
编辑:应该更清楚地说明我是专门询问是否有内置的方法来执行上述操作。
我认为我们没有任何内置功能可以在动作上应用分页。但是,我们可以有一个简单的装饰器来做到这一点。使用此装饰器时,请确保您的操作返回列表或查询集。
from functools import wraps
from django.db.models import QuerySet
def paginate(func):
@wraps(func)
def inner(self, *args, **kwargs):
queryset = func(self, *args, **kwargs)
assert isinstance(queryset, (list, QuerySet)), "apply_pagination expects a List or a QuerySet"
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
return inner
Run Code Online (Sandbox Code Playgroud)
@paginate
@action(detail=False, methods=["GET"], name="Past Objects")
def past(self, request, *args, **kwargs):
startdate = datetime.datetime.now()
some_user = UserProfile.objects.get(user__username="someuser")
queryset = self.queryset.filter(
other__attribute__profile=some_user,
creation_date__lte=startdate
).order_by("-creation_date")
return queryset
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1339 次 |
最近记录: |