【问题标题】:Cannot set MODEL_NAME SpatialProxy (POLYGON) with value of type: <class 'django.contrib.gis.geos.polygon.Polygon'>无法使用类型值设置 MODEL_NAME SpatialProxy (POLYGON):<class 'django.contrib.gis.geos.polygon.Polygon'>
【发布时间】:2019-04-01 09:15:10
【问题描述】:

当我尝试对我的一个模型的 url 进行 API 调用时,我面临以下问题:

Cannot set Allotment SpatialProxy (POLYGON) with value of type: <class 'django.contrib.gis.geos.polygon.Polygon'>

我在 PGadmin 中检查模型的定义和数据类型。

完整日志

Traceback:

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/viewsets.py" in view
  103.             return self.dispatch(request, *args, **kwargs)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
  483.             response = self.handle_exception(exc)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/views.py" in handle_exception
  443.             self.raise_uncaught_exception(exc)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/views.py" in dispatch
  480.             response = handler(request, *args, **kwargs)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/mixins.py" in list
  42.         page = self.paginate_queryset(queryset)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/generics.py" in paginate_queryset
  173.         return self.paginator.paginate_queryset(queryset, self.request, view=self)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/pagination.py" in paginate_queryset
  337.         return list(queryset[self.offset:self.offset + self.limit])

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/models/query.py" in __iter__
  272.         self._fetch_all()

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/models/query.py" in _fetch_all
  1179.             self._result_cache = list(self._iterable_class(self))

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/models/query.py" in __iter__
  63.             obj = model_cls.from_db(db, init_list, row[model_fields_start:model_fields_end])

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/models/base.py" in from_db
  507.         new = cls(*values)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/db/models/base.py" in __init__
  424.                 _setattr(self, field.attname, val)

File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/contrib/gis/db/models/proxy.py" in __set__
  75.                 instance.__class__.__name__, gtype, type(value)))

Exception Type: TypeError at /api/cutarea-allotment/
Exception Value: Cannot set Allotment SpatialProxy (POLYGON) with value of type: <class 'django.contrib.gis.geos.polygon.Polygon'>

这是模型的定义:

from renter.models import *
from classification_list.models import*
from django.contrib.gis.db import models
from django.contrib.gis.geos import Polygon
...

class All(models.Model): 
    geom = models.PolygonField(geography=True, null=True, blank=True, verbose_name='geom')
    num_kvr = models.ForeignKey(QartalKeys, models.DO_NOTHING, blank=True, null=True)
    allot_num = models.SmallIntegerField(blank=True, null=True)

怎么了?对于这个问题,我没有找到相关的问题或有用的建议。谢谢。

【问题讨论】:

  • 不是这个特定问题的答案,但可能对其他人有帮助:当我尝试添加一个 gdal 多边形时,我遇到了一个非常相似的错误geos 多边形 - 它们在堆栈跟踪中看起来非常相似!

标签: django postgis geodjango


【解决方案1】:

问题一定与PolygonFieldgeography=True参数有关。
阅读documentation about geography enabled fields,我们看到以下内容:

geography 类型为使用地理坐标(例如 WGS84 经度/纬度)表示的空间特征提供本机支持。 与几何类型使用的平面不同,geography 类型使用其球面表示数据。在地理列上执行的距离和测量操作会自动采用大​​圆弧计算并返回线性单位。换句话说,当在两个地理上调用 ST_Distance 时,会返回一个以米为单位的值(与在 WGS84 中的几何列上调用度数相反)。

由于您将字段设置为期望 geography 类型的对象,然后您尝试传递多边形的非地理表示,因此您会收到错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2020-02-10
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多