Json Django Rest将多个记录收集到一个列表中
我有一个餐馆应用程序,我正在使用序列化程序为它创建api。我有一张饭桌和一张电话号码桌。电话号码表将餐厅id作为外键引用。类似地,还有其他类似的关系。我编写了一个序列化程序,如下所示: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:
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)