序列化sqlite查询到geojson geojango rest framework gis查询



朋友们,请帮我解决下面这个问题:-我有一个数据库(sqlite),我存储点信息,这些点是这样存储的:

请求的数据可以以这种方式存储,然后进行序列化,这是为了控制点的写入错误,并正确引用它们。

Model.py

````
from django.db import models
from django.forms import model_to_dict
# Create your models here.
class Point(models.Model):
name = models.CharField(max_length=150, unique=True, verbose_name="Name")
direction = models.CharField(max_length=200, verbose_name="Direction")
latitude = models.FloatField(verbose_name="Latitude")
longitude = models.FloatField(verbose_name="Longitude")
# We create the str that returns us when the class is called
def __str__(self):
# self.datos = [self.name, self.direction, self.latitude, self.longitude, self.city, self.department]
return self.name
def toJson(self):
item = model_to_dict(self)
return item
# They are changes that I can make to impact the db and registry of the django admin
class Meta:
verbose_name = "Point"
verbose_name_plural = "Points"
db_table = "Point"
```

我试图将查询转换为geojson,但我是新手,不要强迫我找到更好地解释如何使用rest-framework-gis序列化器的文档,我希望我做得正确,如果不是,我希望你能帮助我

  • 创建一个序列化器,尝试将查询转换为geojson,如下所示:Serializers.py

    from django.contrib.gis.geos import Point
    from rest_framework_gis import serializers
    from rest_framework_gis.serializers import GeometrySerializerMethodField
    from .models import *
    class MarketSerializer(serializers.GeoFeatureModelSerializer):
    other_point = GeometrySerializerMethodField()
    def get_other_point(self, obj):
    return Point(obj.latitude, obj.longitude)
    class Meta:
    model = Point
    geo_field = 'other_point'
    
  • 从创建url的角度来看:

    from django.views.generic import TemplateView
    from django.core.serializers import serialize
    from rest_framework import viewsets
    from rest_framework_gis import filters
    from apps.point.serializers import MarketSerializer
    from apps.point.models import *
    # Create your views here.
    class baseView(TemplateView):
    template_name = "base/maps_base.html"
    
    class MarkerViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Point.objects.all()
    serializer_class = MarketSerializer
    bbox_filter_field = 'latitude'
    filter_backends = (filters.InBBoxFilter,)
    

- javascript是这样配置的:

```
const copy =
"© <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors";
const url = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
const osm = L.tileLayer(url, { attribution: copy });
const map = L.map("map", { layers: [osm], minZoom: 1 });
map.locate()
.on("locationfound", (e) => map.setView(e.latlng, 8))
.on("locationerror", () => map.setView([4.6406458,-74.0613249], 6));

async function load_markers() {
const markers_url = `/api/point/?in_bbox=${map
.getBounds()
.toBBoxString()}`;
const response = await fetch(markers_url);
const geojson = await response.json();
return geojson;
}
async function render_markers() {
const markers = await load_markers();
L.geoJSON(markers)
.bindPopup((layer) => layer.feature.properties.name)
.addTo(map);
}
map.on("moveend", render_markers);
```

错误:

```
[23/Dec/2022 21:27:30] "GET /maps/base/ HTTP/1.1" 200 8682
File "/home/cchavita/Documentos/venv/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1297, in build_lookup
lhs = self.try_transform(lhs, lookup_name)
File "/home/cchavita/Documentos/venv/lib/python3.10/site-packages/django/db/models/sql/query.py", line 1341, in try_transform
raise FieldError(
django.core.exceptions.FieldError: Unsupported lookup 'contained' for FloatField or join on the field not permitted, perhaps you meant contains or icontains?
[23/Dec/2022 21:27:30] "GET /api/pdv/?in_bbox=-92.24121093750001,-4.434044005032582,-55.89843750000001,13.581920900545857 HTTP/1.1" 500 158085

```

存储在sqlite中的数据已知有单独的纬度和经度,我需要的帮助是通过验证为什么序列化器不工作并将查询转换为geojson以便javascript识别它以便它在用户指定的位置绘制点来帮助我,提前感谢您,非常感谢。

使序列化器将查询转换为geojson,以便javascript使用rest_framework_gis序列化器进行识别

朋友,我觉得你应该用这个来序列化,祝你好运

localits = list_pdv_client
local_json = [l.serializer() for l in localits]
local_dict = {
"type": "FeatureCollection",
"features": local_json
}
data["markers"] = json.loads(json.dumps(local_dict))

最新更新