2015-09-28 1 views
1

с использованием моделиКак добавить ключевое значение для ModelSerilzer ответа

class PlanSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Plan 
     fields = ("id", "name", "amount") 

с использованием ListAPIView (поскольку только/GET/операция допустима на этом ресурсе)

class PlanList(generics.ListAPIView): 
    queryset = Plan.objects.all() 
    serializer_class = PlanSerializer 

для/GET/

[ 
     { 
      "id": 4, 
      "name": "free", 
      "amount": 110.0 
     }, 
     { 
      "id": 3, 
      "name": "permium", 
      "amount": 60.0 
     } 
    ] 

есть постоянное значение DISCOUNT для отправки в ответ, который должен появляться только один раз i п ответ, так что ответ выглядит

[ 
     { 
      "id": 4, 
      "name": "free", 
      "amount": 110.0 
     }, 
     { 
      "id": 3, 
      "name": "permium", 
      "amount": 60.0 
     }, 
     {"DISCOUNT": 210} 
    ] 

Я попытался сделать эту скидку в качестве свойства и использование его в сериализаторе , но это становилось повторяется для каждого экземпляра, я хочу, чтобы это появилось только один раз.

Любые мысли по этому поводу?

+0

Вы хотите сказать, добавить словарь '{«ДИСКОНТ»: 210}' в список словарей в ответ, потому что без этого, это был бы недопустимый синтаксис. –

ответ

0

Чтобы добавить еще один словарь в ModelSerializer ответ, вы можете переопределить list() метод PlanList зрения.

class PlanList(generics.ListAPIView): 
    queryset = Plan.objects.all() 
    serializer_class = PlanSerializer 

    def list(self, request, *args, **kwargs): 
     instance = self.filter_queryset(self.get_queryset()) 
     page = self.paginate_queryset(instance) 
     if page is not None: 
      serializer = self.get_pagination_serializer(page) 
     else: 
      serializer = self.get_serializer(instance, many=True) 

     serializer_data = serializer.data # get the default serialized data 
     serializer_data.append({"DISCOUNT": 210}) # add a custom dictionary in the response 
     return Response(serializer_data) 

Тогда вам ответ будет выглядеть примерно так:

[ 
     { 
      "id": 4, 
      "name": "free", 
      "amount": 110.0 
     }, 
     { 
      "id": 3, 
      "name": "permium", 
      "amount": 60.0 
     }, 
     { 
      "DISCOUNT": 210 
     } 
    ] 
0

Вы можете перезаписать list method от ListAPIView. Добавление вашего CONSTANT к последним данным сериализатора.

class PlanList(generics.ListAPIView): 
    queryset = Plan.objects.all() 
    serializer_class = PlanSerializer 

    def list(self, request, *args, **kwargs): 
     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) 

     serializer = self.get_serializer(queryset, many=True) 
     #add your constant here 
     final_response = serializer._data.copy() 
     final_response["DISCOUNT"] = 210 
     return Response(final_response) 
+0

с использованием djangorestframework == 3.0.2, метод обновления не поддерживается, пробовал расширять и добавлять без успеха. – navyad

+0

@naveenyadav Я обновил свой ответ, попробуйте. – levi

+0

Получение значения ValueError: элемент последовательности обновления словаря # 0 имеет длину 5; 2 требуется в строке final_response = dict (serializer.data) – navyad

Смежные вопросы