我有一个餐厅应用程序,我正在使用序列化程序为它创建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"]
}
答案 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