2015-10-14 36 views
1

我正在使用django-rest-framework来返回订单。订单使用默认的JSONRenderer类呈现。现在,他们以这种形式返回:为django-rest-framework中的每个序列化元素添加对象关键字

{ 
    "count": 50, 
    "next": "http://127.0.0.1:8000/api/sales/?_=1444830088899&page=2", 
    "previous": null, 
    "results": [ 
     { 
      "order_number": 20, 
      "customer_number": 100 
     }, 
     { 
      "order_number": 21, 
      "customer_number": 101 
     } 
    ] 
} 

我想它Django的REST的架构,使它像这个:

{ 
    "count": 50, 
    "next": "http://127.0.0.1:8000/api/sales/?_=1444830088899&page=2", 
    "previous": null, 
    "results": { 
     "20": { 
      "customer_number": 100 
     }, 
     "21": { 
      "customer_number": 101 
     } 
    } 
} 

的观点:

class SalesList(generics.ListCreateAPIView): 
    serializer_class = SalesSerializer 

    def get_queryset(self): 
     return get_sales(self.request, None) 

有没有办法做到这一点?

回答

1

这是PageNumberPagination分页类使用的默认分页样式。要更改此分页样式并返回我们在results密钥中的自定义响应,我们需要implement a custom pagination style,这将从PageNumberPagination延伸。

CustomPagination类中,我们将覆盖get_paginated_response()并指定我们的自定义分页输出样式。

from rest_framework.compat import OrderedDict 

class CustomPagination(pagination.PageNumberPagination): 

    def get_paginated_response(self, data): 
     # prepare the custom results using 'data' 
     custom_results = {x['order_number']:{'customer_number': x['customer_number']} for x in data}  

     return Response(OrderedDict([ 
      ('count', self.page.paginator.count), 
      ('next', self.get_next_link()), 
      ('previous', self.get_previous_link()), 
      ('results', custom_results) # specify the custom results dictionary 
     ])) 

然后我们需要在我们的DRF设置中指定这个自定义分页类。

REST_FRAMEWORK = { 
    'DEFAULT_PAGINATION_CLASS': 'my_project.my_app.pagination.CustomPagination', # specify the custom pagination class 
...  
} 
+0

非常感谢您的明确答案,它的作品! – Michael

相关问题