Передача модельной функции сериализатору geojson в GeoDjango - PullRequest
0 голосов
/ 17 ноября 2018

Описание проблемы

Хорошо, я пытаюсь добавить функцию, определенную внутри модели (называемой Шоссе), к HttpResponse модели (Шоссе) после сериализации с сериализатором geojson без успеха.

Я пытаюсь найти решение, просматривая исходный код, так как ошибки не передаются, и свойство не отображается в HttpResponse.Однако я мог бы усложнить вещи и, надеюсь, еще раз взглянуть на это.Я открыт для других предложений, возможно, для обновления Шоссе каждый раз, когда местоположение добавляется / изменяется.

Элемент отображается правильно при передаче его на сайт администратора, и все другие поля (не показаны ниже) работают какпредназначен.

PS.Я совершенно новичок во всей системе 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'),
]

1 Ответ

0 голосов
/ 17 ноября 2018

Обновление: Я (Anton vBR) полностью переписал этот ответ, но думаю, что @ruddra заслуживает некоторого уважения. Однако я открыт для альтернативных решений . Надеюсь, этот ответ поможет кому-то в будущем.


Создание нового сериализатора на основе сериализатора geojson

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'
      )
...