Разбор вложенного 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']