Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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
Json Django Rest将多个记录收集到一个列表中_Json_Django_Api_Django Rest Framework_Serialization - Fatal编程技术网

Json Django Rest将多个记录收集到一个列表中

Json Django Rest将多个记录收集到一个列表中,json,django,api,django-rest-framework,serialization,Json,Django,Api,Django Rest Framework,Serialization,我有一个餐馆应用程序,我正在使用序列化程序为它创建api。我有一张饭桌和一张电话号码桌。电话号码表将餐厅id作为外键引用。类似地,还有其他类似的关系。我编写了一个序列化程序,如下所示: class RestaurantOrderSerializer(serializers.ModelSerializer): brand = BrandSerializer() numbers = PhoneNumberSerializer(many=True) class Meta:

我有一个餐馆应用程序,我正在使用序列化程序为它创建api。我有一张饭桌和一张电话号码桌。电话号码表将餐厅id作为外键引用。类似地,还有其他类似的关系。我编写了一个序列化程序,如下所示:

class RestaurantOrderSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()
    numbers = PhoneNumberSerializer(many=True)

    class Meta:
        model = Restaurant
        fields = ('brand', 'address', 'id', 'numbers')
这提供了一个嵌套结构。虽然在某些情况下这里很有用,但它变得不必要了,因为
PhoneNumberSerializer
只有一个字段。对于更简单的json,有没有办法将嵌套折叠到单个字段中

由此:

{
    "restaurant_name": "Blah Blah:
     ...

    "numbers": {
                 {
                  "number": 123
                },{
                  "number": 456
                  }
                }
}
致:


您可以重写
to_representation()
方法来实现这一点

如果需要更改序列化、反序列化或验证 可以通过重写
.to_representation()
.to_internal_value()
方法

您需要执行以下操作:

class RestaurantOrderSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()
    numbers = PhoneNumberSerializer(many=True)

    class Meta:
        model = Restaurant
        fields = ('brand', 'address', 'id', 'numbers')

    def to_representation(self, obj):
        # get the default representation
        serialized_data = super(RestaurantOrderSerializer, self).to_representation(obj)
        numbers = serialized_data['numbers'] 
        serialized_data['numbers'] = [x['number'] for x in numbers] # list of numbers
        return serialized_data

看起来您已经编写了自己的序列化程序,在本例中不需要它。您可以使用StringRelatedField(many=True)


数字
不应该是字典列表吗?
class RestaurantOrderSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()
    numbers = PhoneNumberSerializer(many=True)

    class Meta:
        model = Restaurant
        fields = ('brand', 'address', 'id', 'numbers')

    def to_representation(self, obj):
        # get the default representation
        serialized_data = super(RestaurantOrderSerializer, self).to_representation(obj)
        numbers = serialized_data['numbers'] 
        serialized_data['numbers'] = [x['number'] for x in numbers] # list of numbers
        return serialized_data
from rest_framework import serializers 
class RestaurantOrderSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()
    numbers = serializers.StringRelatedField(many=True)