Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django rest框架json序列化程序_Json_Django_Serialization_Django Rest Framework - Fatal编程技术网

django rest框架json序列化程序

django rest框架json序列化程序,json,django,serialization,django-rest-framework,Json,Django,Serialization,Django Rest Framework,我想要Django rest框架的json响应,所以我有如下json响应: [ { "id": 1, "TitleEnglish": "Tiny Talents Program", "TitleArabic": "Tiny Talents Program", "DescriptionEnglish": "Timing: 8:00 am till 1:00 pm", "DescriptionArabic": "

我想要Django rest框架的json响应,所以我有如下json响应:

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

最简单的解决方案是重写为_表示法

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

我认为您可以通过自定义为
列表
请求创建序列化响应时使用的行为来实现这一点。

我们可以创建一个自定义的
PromotionListSerializer
,当使用
many=Tue
参数将多个实例传递给序列化程序进行序列化时,将使用它

我们重写
PromotionListSerializer
类中的
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 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
中指定此自定义列表序列化程序类。当序列化多个实例时,将使用此自定义列表序列化程序类

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

        # define the custome list serializer class to be used
        list_serializer_class = PromotionListSerializer
解决方案2:

覆盖视图的
列表
方法,并返回自定义表示,而不是中提到的默认响应

扩展答案,这也将为分页响应提供支持。这是DRF中的实际代码,我刚刚返回了
custom_表示形式
,而不是最后的
serializer.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": "--"
    }
]
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)

我通过改变我的观点来解决我的问题:

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

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

您需要创建一个自定义渲染器。我从未尝试过这个,但我相信它适合你的问题仍然有问题
[{“数据”:{“id”:1,“TitleEnglish”:“Tiny Talents Program”,“TitleArabic”:“Tiny Talents Program”,“DescriptionEnglish”:“时间:上午8:00到下午1:00”,“DescriptionArabic”:“时间:上午8:00至下午1:00”,“类别英语”:“艺术与教育”,“类别亚拉比语”:“艺术与教育”,“日期”:“2015-05-07”,“状态”:真实,“图像”:“-“}]
我想删除起始数组,从字典开始,然后是数据数组,请参见我的问题格式。感谢您的帮助:)更新了ans。实际上,在出现
列表
请求的情况下,即当多个实例被序列化时,仅重写
to_表示法
是行不通的。DRF使用
返回列表to_representation
之后的
中的de>类,该属性再次为我提供了一个列表。我可以通过创建自定义列表序列化器类并重写
数据
属性来解决此问题,以便它返回我的自定义表示。ans中给出的方法也正确地解决了此问题。我已经稍微扩展了您的解决方案。请检查:)谢谢,它也会解决我的问题,但我已经解决了:)太好了!我也在做同样的工作,在序列化程序的
Meta
类中定义了
list\u serializer\u类。将更新我以前的ans。这是解决问题的另一个选项代码更少,覆盖更少!+1这很优雅!