Как правильно вкладывать сериализаторы в Django REST Framework?
Я должен начать говорить, что ни одно из решений, представленных в подобном вопросе, кажется, не работает для меня.
У меня есть две модели
class Building(models.Model):
(...)
address = models.ForeignKey('common.Address', null=True)
class Address (models.Model):
(...)
latlng = models.PointField(null=True)
Я использую сериализаторы Django REST Framework (с дополнительным расширением ГИС) для сериализации этих моделей:
class BuildingSerializer(serializers.ModelSerializer):
class Meta:
model = Building
class AddressSerializer(serializers.GeoModelSerializer):
class Meta:
model = Address
С сериализаторами по умолчанию я получаю JSON, который выглядит так:
results": [
{
(...)
"address": 1
}
]
И желаемый JSON будет выглядеть так:
results": [
{
(...)
"address": 1,
"latlng": {
"type": "Point",
"coordinates": [
11.0,
11.0
]
},
},
]
Где latlng - это поле из адреса, у которого здание может быть только одно.
Использование этого http://www.django-rest-framework.org/api-guide/serializers/ throws и error:
Got AttributeError when attempting to get a value for field `latlng` on serializer `BuildingSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Building` instance.
Original exception text was: 'Building' object has no attribute 'latlng'.
1 ответ
Решение
Простейшим подходом было бы добавить поле latlng в сериализатор Building и реализовать метод для его извлечения:
class BuildingSerializer(serializers.ModelSerializer):
class Meta:
model = Building
latlng = serializers.SerializerMethodField()
def get_latlng(self, obj):
if obj.address and obj.address.latlng:
return {
"type": obj.address.latlng.geom_type,
# any other fields in latlng
}