django rest框架json序列化器

时间:2015-08-06 10:12:27

标签: json django serialization django-rest-framework

我想从Django休息框架得到json响应,所以我有这样的Json Response:。

[
    {
        "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')

3 个答案:

答案 0 :(得分:4)

我通过更改我的观点解决了我的问题:

我添加了一个列表方法,我的问题解决了:

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

答案 1 :(得分:2)

我认为您可以通过自定义为list请求创建序列化响应时使用的ListSerializer行为来实现此目的。

我们可以创建一个自定义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 中指定此自定义列表序列化程序类。在序列化多个实例时,将使用此自定义列表序列化程序类。

list

<强>解决方案-2:

覆盖视图的custom_representation方法并返回自定义表示,而不是your ans.

中提到的默认响应

扩展OP's答案,这也将为分页响应提供支持。这是DRF中的实际代码,我刚刚返回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)

$payload_array = json.decode($payload,true);

答案 2 :(得分:1)

最简单的解决方案是覆盖to_representation方法

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