我想从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')
答案 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 }