[Fixed]-Django Rest Framework – How to nest several fields in a serializer?

11👍

I’d suggest simply using explicit serializer classes, and writing the fields explicitly. It’s a bit more verbose, but it’s simple, obvious and maintainable.

class LocationSerializer(serializers.Serializer):
    lat = serializers.FloatField()
    lon = serializers.FloatField()
    provider = serializers.CharField(max_length=100)
    accuracy = serializers.DecimalField(max_digits=3, decimal_places=1)

class FeatureSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=100)
    location = LocationSerializer()

    def create(self, validated_data):
        return Feature.objects.create(
            name=validated_data['name'],
            lat=validated_data['location']['lat'],
            lon=validated_data['location']['lat'],
            provider=validated_data['location']['provider'],
            accuracy=validated_data['location']['accuracy']
        )

    def update(self, instance, validated_data):
        instance.name = validated_data['name']
        instance.lat = validated_data['location']['lat']
        instance.lon = validated_data['location']['lat']
        instance.provider = validated_data['location']['provider']
        instance.accuracy = validated_data['location']['accuracy']
        instance.save()
        return instance

There’s a bunch of ways you could use a ModelSerializer instead, or ways to keep the create and update methods a little shorter, but it’s not clear that the extra indirection you’d be giving yourself is at all worth it.

We almost always use completely explicit serializer classes for APIs that we’re building.

Leave a comment