将模型函数传递给 GeoDjango 中的 geojson 序列化程序
Passing a model function to geojson serializer in GeoDjango
问题描述
好的,在使用 geojson 序列化程序进行序列化但没有成功后,我正在尝试将模型(称为 Highway)中定义的函数添加到模型(Highway)的 HttpResponse。
我试图通过查看源代码找到解决方案,因为没有传递任何错误并且 属性 没有出现在 HttpResponse 中。但是,我可能 会使事情复杂化 ,希望能对此有所了解。我对其他建议持开放态度,也许每次位置 added/modified.
时更新高速公路
项目在传递到管理站点时正确显示,所有其他字段(下面未显示)按预期工作。
PS。我对整个 Django 系统很陌生。谢谢!
Django 版本:2.1
相关链接:
- https://docs.djangoproject.com/en/2.1/ref/contrib/gis/serializers/
- https://github.com/django/django/blob/master/django/contrib/gis/serializers/geojson.py
精简代码
geom.models.py
class Highway(models.Model):
name = models.CharField(max_length=50, unique=True)
length = models.IntegerField("Length in meters")
mline = models.MultiLineStringField("Geometry", srid=4326)
def cameras_per_km(self):
#THIS IS THE FUNCTION I AM TRYING TO SEND TO GEOJSON SERIALIZER
count = self.location_set.filter(location__icontains="camera").count()
return round(count/(self.length/1000),1)
cameras_per_km.short_description = "Cameras/km"
class Location(models.Model):
location = models.CharField(max_length=30, unique=True)
highway = models.ForeignKey(Highway, null=True, on_delete=models.SET_NULL)
point = models.PointField()
geom.admin.py(将函数传递给 list_display 时,该项目在管理员中正确显示)
class HighwayAdmin(LeafletGeoAdmin):
list_display = ('name', 'cameras_per_km')
admin.site.register(
Highway,
HighwayAdmin,
)
geom.views.py(这不是)
def geojson_highway_all(request):
geojsonformat = serialize('geojson',
Highway.objects.all(),
geometry_field='mline',
fields = (
'pk',
'cameras_per_km' # <-- I want this to show
)
)
return HttpResponse(geojsonformat)
geom.urls.py
from django.urls import path
from . import views
app_name = 'geom'
urlpatterns = [
path('highways.geojson', views.geojson_highway_all, name='highways.geojson'),
]
更新: 我 (Anton vBR) 现在已经完全重写了这个答案,但认为 @ruddra 值得称赞。然而,我对替代解决方案持开放态度。希望这个回答能对以后的人有所帮助。
基于geojson序列化器创建一个新的Serializer
geom.views.py
from django.contrib.gis.serializers.geojson import Serializer
class CustomSerializer(Serializer):
def end_object(self, obj):
for field in self.selected_fields:
if field == self.geometry_field or field == 'pk':
continue
elif field in self._current.keys():
continue
else:
try:
self._current[field] = getattr(obj, field)()
except AttributeError:
pass
super(CustomSerializer, self).end_object(obj)
geojsonformat = CustomSerializer().serialize(
Highway.objects.all(),
geometry_field='mline',
fields = (
'pk',
'cameras_per_km'
)
问题描述
好的,在使用 geojson 序列化程序进行序列化但没有成功后,我正在尝试将模型(称为 Highway)中定义的函数添加到模型(Highway)的 HttpResponse。
我试图通过查看源代码找到解决方案,因为没有传递任何错误并且 属性 没有出现在 HttpResponse 中。但是,我可能 会使事情复杂化 ,希望能对此有所了解。我对其他建议持开放态度,也许每次位置 added/modified.
时更新高速公路项目在传递到管理站点时正确显示,所有其他字段(下面未显示)按预期工作。
PS。我对整个 Django 系统很陌生。谢谢!
Django 版本:2.1
相关链接:
- https://docs.djangoproject.com/en/2.1/ref/contrib/gis/serializers/
- https://github.com/django/django/blob/master/django/contrib/gis/serializers/geojson.py
精简代码
geom.models.py
class Highway(models.Model):
name = models.CharField(max_length=50, unique=True)
length = models.IntegerField("Length in meters")
mline = models.MultiLineStringField("Geometry", srid=4326)
def cameras_per_km(self):
#THIS IS THE FUNCTION I AM TRYING TO SEND TO GEOJSON SERIALIZER
count = self.location_set.filter(location__icontains="camera").count()
return round(count/(self.length/1000),1)
cameras_per_km.short_description = "Cameras/km"
class Location(models.Model):
location = models.CharField(max_length=30, unique=True)
highway = models.ForeignKey(Highway, null=True, on_delete=models.SET_NULL)
point = models.PointField()
geom.admin.py(将函数传递给 list_display 时,该项目在管理员中正确显示)
class HighwayAdmin(LeafletGeoAdmin):
list_display = ('name', 'cameras_per_km')
admin.site.register(
Highway,
HighwayAdmin,
)
geom.views.py(这不是)
def geojson_highway_all(request):
geojsonformat = serialize('geojson',
Highway.objects.all(),
geometry_field='mline',
fields = (
'pk',
'cameras_per_km' # <-- I want this to show
)
)
return HttpResponse(geojsonformat)
geom.urls.py
from django.urls import path
from . import views
app_name = 'geom'
urlpatterns = [
path('highways.geojson', views.geojson_highway_all, name='highways.geojson'),
]
更新: 我 (Anton vBR) 现在已经完全重写了这个答案,但认为 @ruddra 值得称赞。然而,我对替代解决方案持开放态度。希望这个回答能对以后的人有所帮助。
基于geojson序列化器创建一个新的Serializer
geom.views.py
from django.contrib.gis.serializers.geojson import Serializer
class CustomSerializer(Serializer):
def end_object(self, obj):
for field in self.selected_fields:
if field == self.geometry_field or field == 'pk':
continue
elif field in self._current.keys():
continue
else:
try:
self._current[field] = getattr(obj, field)()
except AttributeError:
pass
super(CustomSerializer, self).end_object(obj)
geojsonformat = CustomSerializer().serialize(
Highway.objects.all(),
geometry_field='mline',
fields = (
'pk',
'cameras_per_km'
)