Parsing nested JSON in Django Rest Framework

34 views Asked by At

I am trying to serialize a geometry dict which also contains a location dict and map that dictionaries values to my model. The data comes in two levels deep and is mapped to a single model, because its from an external API. How I've done it so far is with source='*' but this requires a new ModelSerializer for every nested object. Is there a way to "skip" to the nested object I want?

For example here is some input data:

{
    ...
    geometry: {
        location: {
            lat: ...,
            lng: ...,
         }
    }
    ...
}

Then I map it to a model like this:

class MyModel(models.Model):
    ...other attributes from 1 level deep
    latitude = CharField()
    longitude = CharField()

And my current serializer do that like this:

class GeometrySerializer(serializers.ModelSerializer):
    latitude = serializers.DecimalField(max_digits=globals.MAX_DECIMAL_DIGITS, decimal_places=globals.MAX_DECIMAL_PLACES)

    longitude = serializers.DecimalField(max_digits=globals.MAX_DECIMAL_DIGITS, decimal_places=globals.MAX_DECIMAL_PLACES)

    class Meta:
        model = models.Location
        fields = ['latitude', 'longitude']

class GeometryLocationSerializer(serializers.ModelSerializer):
    location = GeometrySerializer(source='*')

    class Meta:
        model = models.Location
        fields = ['location']


class LocationSerializer(serializers.ModelSerializer):
    # Nested obj from json req, geometry: { location: { lat: ..., lng: ...} ....}
    #latitude = serializers.DecimalField(max_digits=globals.MAX_DECIMAL_DIGITS, decimal_places=globals.MAX_DECIMAL_PLACES, source='geometry.location.lat')

    #longitude = serializers.DecimalField(max_digits=globals.MAX_DECIMAL_DIGITS, decimal_places=globals.MAX_DECIMAL_PLACES, source='geometry.location.lng')
    geometry = GeometryLocationSerializer(source='*')

    class Meta:
        model = models.Location
        fields = ['id', 'addr_address', 'business_status', 'formatted_address', 'formatted_phone_number', 'icon', 'icon_background_color', 'icon_mask_base_uri',
                        'international_phone_number', 'name', 'place_id', 'rating', 'reference', 'url', 'user_ratings_total', 'vicinity', 'website', 'geometry',
                        'compound_code', 'global_code']
        read_only_fields = ['id']
0

There are 0 answers