1 回答

TA贡献1834条经验 获得超8个赞
所以最后我通过RelatedField为每个外键使用而不是单独的序列化器解决了这个问题,除了嵌套EventSerializer的是真正需要编写嵌套Event对象的。
这是RaceSerializer:
class RaceSerializer(serializers.ModelSerializer):
owner = UserSerializer(read_only=True)
type = TypeField()
country = CountryField()
region = RegionField()
timezone = TimezoneField()
events = EventSerializer(many=True)
race_cal_types = serializers.SerializerMethodField()
def create(self, validated_data):
with transaction.atomic():
events = validated_data.pop('events', None)
race = Race(**validated_data)
race.save()
for event in events:
Event.objects.create(race=race, **event)
return race
这是我在我的每个字段中使用的组合RelatedField,例如外键:ModelSerializerRaceSerializerregion
class RegionSerializer(serializers.ModelSerializer):
class Meta:
model = Region
fields = ('pk', 'name', 'code')
class RegionField(RelatedField):
def get_queryset(self):
return Region.objects.all()
def to_internal_value(self, data):
return self.get_queryset().get(**data)
def to_representation(self, value):
return RegionSerializer(value).data
每个字段 ( type, region, country, timezone) 都有自己的to_internal_value方法to_representation,可以按照我需要的方式序列化/反序列化数据。
添加回答
举报