Skip to main content
 首页 » 编程设计

python之将模型函数传递给 GeoDjango 中的 geojson 序列化程序

2024年12月31日22zfyouxi

问题描述

好的,在使用 geojson 序列化程序进行序列化但未成功后,我正在尝试将模型(称为 Highway)中定义的函数添加到模型(Highway)的 HttpResponse。

我正在尝试通过查看源代码来找到解决方案,因为没有传递任何错误并且该属性没有出现在 HttpResponse 中。但是,我可能会使事情复杂化,并希望能对此有所了解。我对其他建议持开放态度,可能会在每次添加/修改位置时更新高速公路。

该项目在传递到管理站点时正确显示,所有其他字段(下面未显示)按预期工作。

附言。我对整个 Django 系统很陌生。谢谢!

Django 版本:2.1

相关链接:

  1. https://docs.djangoproject.com/en/2.1/ref/contrib/gis/serializers/
  2. 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' 
      )