Разбор вложенного JSON в Django Rest Framework

Я пытаюсь сериализовать дикту геометрии, которая также содержит дикту местоположения, и отобразить значения этих словарей в мою модель. Данные поступают на два уровня вглубь и отображаются на одну модель, поскольку они получены из внешнего API. До сих пор я делал это с помощью source='*', но это требует нового ModelSerializer для каждого вложенного объекта. Есть ли способ "перейти" к нужному мне вложенному объекту?

Например, вот некоторые входные данные:

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

Затем я отображаю его на модель следующим образом:

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

А мой текущий сериализатор делает это следующим образом:

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']
Вернуться на верх