gpt4 book ai didi

django - 如何使用 django-rest-framework-(gis) 展平外键对象

转载 作者:行者123 更新时间:2023-12-01 18:57:53 24 4
gpt4 key购买 nike

我已经寻找了一个最新的、针对我的问题的解决方案,但还没有找到解决方案或明确的文档来说明我真正需要做什么才能使关系扁平化以符合 geojson 规范.

这个问题与我的几乎相同,但是解决方案或答案没有解决问题,仍然产生无效的 GeoJSON。

相关

问题

我有一个 Location 模型,其中包含 SRID=4326 的 pointfield。我还有一个 TrainStation 模型,其中 location 字段作为 Location外键。当我通过 GeoFeatureModelSerializer 序列化 TrainStation 时,它会生成无效的 GeoJSON(请参阅下面的示例“无效的 geojson”)。

(如果我将 PointField 存储在 TrainStation 模型中的位置,当然可以获得有效的 GeoJSON,但就我而言,我不能这样做所以我需要以某种方式将其压平。)

问题

  • 如何实现像下面的“Valid GeoJSON”示例那样的输出?

研究

我是 Python 和 Django 的新手,因此我还不太擅长阅读其他人的源代码,但是我认为我可以得出结论,我需要以某种方式重写 to_representation() 方法为了得到我想要的东西,但我的搜索到目前为止没有结果,所以我陷入了困境。

模型.py

class Location(models.Model):

point = models.PointField()

class TrainStation(models.Model):

location_signature = models.CharField(primary_key=True, max_length=32)
advertised_location_name = models.CharField(max_length=32)
country_code = models.ForeignKey(Country)
county_no = models.ForeignKey(County)
location = models.ForeignKey(Location, null=True)

序列化器.py

class LocationSerializer(ModelSerializer):

class Meta:
model = Location
geo_field = 'point'
fields = [
'point',
]


class TrainStationSerializer(GeoFeatureModelSerializer):

location_signature = PrimaryKeyRelatedField(read_only=True)
location = LocationSerializer(read_only=True)
country_code = StringRelatedField(read_only=True)
county_no = StringRelatedField(read_only=True)

class Meta:
model = TrainStation
geo_field = 'location'
fields = [
'location_signature',
'advertised_location_name',
'country_code',
'county_no',
]

GeoJSON 输出示例:

我已经验证了 http://geojson.io 上的输出以确定其是否有效。

无效的 GeoJSON

{
"type": "FeatureCollection",
"features": [
{
"id": "Ak",
"type": "Feature",
"geometry": {
"point": { <------+------ offending lines
"type": "Point", |
"coordinates": [ |
18.8303462142963, |
68.3486410812835 |
] |
} <------+
},
"properties": {
"advertised_location_name": "Abisko Östra",
"country_code": "Sverige",
"county_no": "Norrbottens län"
}
}
]
}

有效的 GeoJSON

这是我正在寻找的输出。

{
"type": "FeatureCollection",
"features": [
{
"id": "Ak",
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
18.8303462142963,
68.3486410812835
]
},
"properties": {
"advertised_location_name": "Abisko Östra",
"country_code": "Sverige",
"county_no": "Norrbottens län"
}
}
]
}

最佳答案

我现在已经使用以下代码解决了这个问题:

class LocationSerializer(ModelSerializer):

def to_representation(self, obj):

representation = super().to_representation(obj)
point_representation = representation.pop('point')
for key in point_representation:
representation[key] = point_representation[key]

return representation

class Meta:
model = Location
geo_field = 'point'
fields = [
'point',
]

这确实产生了有效的 GeoJSON:

{
"type": "FeatureCollection",
"features": [
{
"id": "Ak",
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
18.8303462142963,
68.3486410812835
]
},
"properties": {
"advertised_location_name": "Abisko Östra",
"country_code": "Sverige",
"county_no": "Norrbottens län"
}
}
]
}

如果有人对此有任何意见,请随时贡献并添加答案:-)

关于django - 如何使用 django-rest-framework-(gis) 展平外键对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44857249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com