2015-08-06 10 views
3

Мне нужен ответ json из рамки Django rest, поэтому у меня есть Json Response вот так:.django rest framework json serializer

[ 
    { 
     "id": 1, 
     "TitleEnglish": "Tiny Talents Program", 
     "TitleArabic": "Tiny Talents Program", 
     "DescriptionEnglish": "Timing: 8:00 am till 1:00 pm", 
     "DescriptionArabic": "Timing: 8:00 am till 1:00 pm", 
     "CategoryEnglish": "Art & Education ", 
     "CategoryArabic": "Art & Education ", 
     "Date": "2015-05-07", 
     "Status": true, 
     "Image": "--" 
    } 
] 

, но мне нужно ответ, как это:

{ 
"data": [ 
    { 
     "id": 1, 
     "TitleEnglish": "Tiny Talents Program", 
     "TitleArabic": "Tiny Talents Program", 
     "DescriptionEnglish": "Timing: 8:00 am till 1:00 pm", 
     "DescriptionArabic": "Timing: 8:00 am till 1:00 pm", 
     "CategoryEnglish": "Art & Education ", 
     "CategoryArabic": "Art & Education ", 
     "Date": "2015-05-07", 
     "Status": true, 
     "Image": "--" 
    } 
     ] 
} 

Мой сериализатору код является:

class PromotionSerializer(serializers.HyperlinkedModelSerializer): 
    CategoryEnglish = serializers.CharField(read_only=True, source="Category.TitleEnglish") 
    CategoryArabic = serializers.CharField(read_only=True, source="Category.TitleArabic") 
    class Meta: 
     model = Promotion 
     fields = ('id', 'TitleEnglish', 'TitleArabic', 'DescriptionEnglish', 'DescriptionArabic', 'CategoryEnglish','CategoryArabic', 'Date','Status','Image') 
+0

Вам нужно создать пользовательский визуализатор. Http: //www.django-rest-framework.орг/апи-гид/рендеры/# заказные-рендеры Я никогда не пробовал это, но я считаю, что подходит ваша проблема –

ответ

0

Самое простое решение переопределить метод to_representation

def to_representation(self, instance): 
    data = super(PromotionSerializer, self).to_representation(instance) 
    return {'data': data } 
2

Я думаю, вы можете это сделать, настроив поведение ListSerializer, которое используется при создании сериализованного ответа для запросов list.

Мы можем создать пользовательский PromotionListSerializer, который будет использоваться, когда несколько экземпляров передаются в сериализатор для сериализации с использованием аргумента many=Tue.

Мы переопределяем свойство data в нашем классе PromotionListSerializer, чтобы вместо этого вернуть пользовательское представление.

class PromotionListSerializer(serializers.ListSerializer): 

    @property 
    def data(self): 
     # call the super() to get the default serialized data 
     serialized_data = super(PromotionListSerializer, self).data  
     custom_representation = {'data': serialized_data} # insert the above response in a dictionary 
     return custom_representation 

Затем в PromotionSerializer, указать этот пользовательский класс список сериализатора в Meta. Этот класс сериализатора настраиваемых списков будет использоваться тогда при сериализации нескольких экземпляров.

class PromotionSerializer(serializers.HyperlinkedModelSerializer): 
    CategoryEnglish = serializers.CharField(read_only=True, source="Category.TitleEnglish") 
    CategoryArabic = serializers.CharField(read_only=True, source="Category.TitleArabic") 
    class Meta: 
     model = Promotion 
     fields = ('id', 'TitleEnglish', 'TitleArabic', 'DescriptionEnglish', 'DescriptionArabic', 'CategoryEnglish','CategoryArabic', 'Date','Status','Image') 

     # define the custome list serializer class to be used 
     list_serializer_class = PromotionListSerializer 

Solution-2:

Override list метод представления и вернуть пользовательское представление вместо ответа по умолчанию, которые вы сделали, как указано в your ans.

Расширение OP's ответ, это также обеспечит поддержку постраничного ответа. Это фактический код в DRF, и я только что вернул custom_representation вместо serializer.data в конце.

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) 
    serialized_data = serializer.data 
    custom_representation = {'data': serialized_data} 
    return Response(custom_representation) 
+0

все еще есть проблемы '[ { "данные": { "ID": 1, «TitleEnglish »:« Программа крошечных талантов », « TitleArabic »:« Программа крошечных талантов », « DescriptionEnglish »:« Сроки: с 8:00 до 13:00 », « ОписаниеArabic »:« Сроки: 8:00 до 1:00 вечера ", " КатегорияEnglish ":" Искусство и образование ", " CategoryArabic ":« Искусство и образование », « Дата »:« 2015-05-07 », « Статус »: true, «Изображение»: «-» } } ] ' –

+0

Я хочу удалить начальный массив и начать со словаря, а затем массив данных см. В моем формате вопроса. Спасибо за вашу помощь :) –

+0

Обновлено ан. Фактически, просто переопределение «to_representation» не будет работать в случае запроса «list», т. Е. Когда несколько экземпляров сериализуются. DRF использует класс 'ReturnList' в свойстве' .data' после вызова 'to_represention', который снова дал мне список. Я мог бы решить эту проблему, создав класс Сериализатор пользовательского списка и переопределив свойство data, чтобы он возвращал мое пользовательское представление. –

2

Я решить мою проблему, изменив в моих Просмотры:

Я добавил метод списка, моя проблема решена:

def list(self, request): 
    queryset = Promotion.objects.all() 
    serializer_class = PromotionSerializer(queryset, many=True) 
    serialized_data = {'data': serializer_class.data} 
    return Response(serialized_data) 
+0

Отлично! Я также работал над тем же и сделал, указав «list_serializer_class» в классе «Meta» в сериализаторах. Обновит мои предыдущие ан. –

+0

Это еще один вариант решения проблемы с меньшим количеством кода и меньшим количеством переопределения! +1 –

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