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.
Source:stackexchange.com