如何在Django REST Framework中正确嵌套序列化程序?

时间:2015-02-17 09:17:54

标签: python django django-rest-framework geojson django-rest-framework-gis

我需要开始说,类似问题中提供的解决方案似乎都不适合我。

我有两个型号

class Building(models.Model):
    (...)
    address =  models.ForeignKey('common.Address', null=True)

class Address (models.Model):
    (...)
    latlng = models.PointField(null=True)

我正在使用Django REST Framework(带有附加的GIS扩展)序列化器来序列化这些模型:

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/#dealing-with-nested-objects投掷和错误:

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 个答案:

答案 0 :(得分:2)

最简单的方法是将一个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
            }