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

时间:2015-08-13 14:13:26

标签: json django api django-rest-framework serializer

我有一个餐厅应用程序,我正在使用序列化程序为它创建api。我有一张餐桌和一个电话号码表。电话号码表将restaurant_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
                  }
                }
}

要:

{
"restaurant_name": "Blah Blah:
...
"numbers": ["123", "456"]

}

2 个答案:

答案 0 :(得分:1)

看起来您已经编写了自己的序列化程序,在这种情况下您不需要。您可以使用StringRelatedField(many = True)。

from rest_framework import serializers 
class RestaurantOrderSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()
    numbers = serializers.StringRelatedField(many=True)

答案 1 :(得分:0)

您可以覆盖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