首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-rest-framework-gis将外键对象序列化为geojson时出错

使用django-rest-framework-gis将外键对象序列化为geojson时出错
EN

Stack Overflow用户
提问于 2020-04-15 22:08:01
回答 1查看 348关注 0票数 1

我正在尝试将一个具有几何字段的外键模型序列化为geojson。我正在使用django-rest框架-gis。我使用django 2.2

我被困在这个,没有其他相关的答案堆栈溢出为我工作。例如,我尝试过这样的版本:

问题是我得到了这个错误:期望从视图返回一个ResponseHttpResponseHttpStreamingResponse,但是收到了一个<class 'statements.models.Response'>

模型:

代码语言:javascript
复制
from django.contrib.gis.db import models
from django.contrib.gis.geos import Point

class Hexgrid_10km2(models.Model):
    lng = models.FloatField()
    lat = models.FloatField()
    polygon = models.MultiPolygonField(srid=4326)
    centroid = models.PointField(default=Point(0,0), srid=4326)

    def __str__(self):
        return f'lng: { self.lng } lat: {self.lat }'


class Response(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    statement = models.ForeignKey(Statement, on_delete=models.CASCADE)
    hexgrid_10km2 = models.ForeignKey(Hexgrid_10km2, on_delete=models.CASCADE, null=True, blank=True)

    @property
        def polygon(self):
            return self.hexgrid_10km2.polygon

视图

代码语言:javascript
复制
class ResponseHeatmapAPIView(APIView): #ReadOnly

    def get(self, request, pk):
        final = Response.objects.all()
        serializer = ResponseHeatmapSerializer(final, many=True)
        return Response(serializer.data)

序列化器

代码语言:javascript
复制
class ResponseHeatmapSerializer(GeoFeatureModelSerializer):
    """ A class to serialize hex polygons as GeoJSON compatible data """

    hexgrid_10km2 = GeometrySerializerMethodField()

    def get_hexgrid_10km2(self, obj):
        return obj.hexgrid_10km2.polygon

    class Meta:
        model = Response
        geo_field = 'hexgrid_10km2'
        id_field = False
        fields = ('id',)

溯源

代码语言:javascript
复制
OrderedDict([('type', 'FeatureCollection'), ('features', [OrderedDict([('id', 2), ('type', 'Feature'), ('geometry', GeoJsonDict([('type', 'MultiPolygon'), ('coordinates', [[[[0.52353663711945, 50.8631481850499], [0.538799411254891, 50.86870974483], [0.554062185390241, 50.8631481850499], [0.554062185390241, 50.852023074998], [0.548895002474644, 50.85013962], [0.540831980000019, 50.85013962], [0.53199000192362, 50.8489417564374], [0.52353663711945, 50.852023074998], [0.52353663711945, 50.8631481850499]]]])])), ('properties', OrderedDict([('response_date', '2020-04-15T21:04:04.599597Z'), ('agree', 1), ('hasLocation', False), ('location', GeoJsonDict([('type', 'Point'), ('coordinates', [0.550660257722784, 50.851541821108924])])), ('latitude', 50.851541821108924), ('longitude', 0.5506602577227836), ('locationAccuracy', 0.0), ('user', 1), ('statement', 1)]))])])])
Internal Server Error: /statements/api/heatmap/1
Traceback (most recent call last):
  File "C:\Users\anton\OneDrive\Documents\django\karate-project-2.2\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\anton\OneDrive\Documents\django\karate-project-2.2\venv\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\anton\OneDrive\Documents\django\karate-project-2.2\venv\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\anton\OneDrive\Documents\django\karate-project-2.2\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\anton\OneDrive\Documents\django\karate-project-2.2\venv\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\anton\OneDrive\Documents\django\karate-project-2.2\venv\lib\site-packages\rest_framework\views.py", line 507, in dispatch
    self.response = self.finalize_response(request, response, *args, **kwargs)
  File "C:\Users\anton\OneDrive\Documents\django\karate-project-2.2\venv\lib\site-packages\rest_framework\views.py", line 419, in finalize_response
    assert isinstance(response, HttpResponseBase), (
AssertionError: Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` to be returned from the view, but received a `<class 'statements.models.Response'>`
[15/Apr/2020 21:55:04] "GET /statements/api/heatmap/1 HTTP/1.1" 500 89414
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-15 22:29:43

序列化程序正在等待您的数据。当我用一个简单的模型来尝试你的观点时,我也犯了同样的错误。我认为这个定义有问题。你能试一下这个演示文稿吗:

代码语言:javascript
复制
def get(self, request):
    final = Response.objects.all()
    serializer = ResponseHeatmapSerializer(data=final, many=True)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data, status=status.HTTP_201_CREATED)

编辑:

请原谅我的失眠。

这里的问题是表名:Response。您必须更改名称;不知何故,它与RestAPI使用的“响应”冲突。

  • Change Response(model.Model)的名称改为不同的名称。
  • python manage.py迁移

并且视图已经准备好运行(我将模型名更改为'Strawberry' )。

代码语言:javascript
复制
class ResponseHeatmapList(APIView):
    def get(self, request):
        final = Strawberry.objects.all()
        serializer = ResponseHeatmapSerializer(final, many=True)
        return Response(serializer.data)


class ResponseHeatmapDetail(APIView):
    def get_object(self, pk):
        try:
            return Strawberry.objects.get(pk=pk)
        except Strawberry.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        final = self.get_object(pk)
        serializer = ResponseHeatmapSerializer(final)
        return Response(serializer.data)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61239446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档