Django REST中的Groupby序列化程序

2024-10-02 08:18:13 发布

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

我正在尝试编写API端点,这将需要多少时间?groupby=[field]作为参数,并将其传递给CSV呈现器。问题是我的代码看起来有点黑。有没有更好的办法?可能使用过滤器?你知道吗

class MyCSVRenderer(CSVRenderer):
header = ['logged_at', 'chain_key', 'buyer', 'seller', 'amount']

class ChainsViewset(viewsets.ModelViewSet):
serializer_class = ledger_serializers.ChainsSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_class = ChainFilter

def get_queryset(self):
    return ledger_models.ChainLink.objects.all()

@renderer_classes((MyCSVRenderer,))
def list(self, request, *args, **kwargs):
    groupby = self.request.query_params.get('groupby', None)
    queryset = self.filter_queryset(self.get_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)

    if groupby:
        queryset = queryset.values(groupby).annotate(amount=Sum('amount'))
        if queryset:
            MyCSVRenderer.header = queryset[0].keys()
            serializer = self.get_serializer(queryset, many=True, fields=tuple(queryset[0].keys()))
    else:
        MyCSVRenderer.header = ['logged_at', 'chain_key', 'buyer', 'seller', 'amount']
        serializer = self.get_serializer(queryset, many=True)

    return Response(serializer.data)

renderer_classes = (BrowsableAPIRenderer, JSONRenderer, CSVRenderer)

Tags: selftruegetreturnifpagefilteramount

热门问题