以这个模型为例:
from django.contrib.gis.db import models
class Location(models.Model):
point = models.PointField(null=True, blank=True)
然后尝试执行此操作,故意给它一个错误的SRID:
from django.contrib.gis.geos import Point
from testpoint.models import Location
some_location = Location()
some_location.point = Point(x=15, y=16, srid=210)
some_location.save()
在执行最后一条语句some_location.save()
时,控制台上将显示消息“unknown SRID:210”。到现在为止,一直都还不错。问题是.save()
返回成功,null存储在point
;但是我想要的是不保存任何内容并引发异常。你知道吗
Django似乎将此SQL发送到spatialite:
INSERT INTO "testpoint_location" ("point")
VALUES (Transform(GeomFromText('POINT(15.0 16.0)', 210), 4326))
spatialite似乎执行了它(控制台上打印了警告),但从未告诉Django出了什么问题。你知道吗
当SRID错误时,如何告诉spatialite失败并返回错误?你知道吗
在GeoDjango上Database API documentation指出:
在^{} 上,它是
PointField
的基础,默认srid设置为4326。它警告您srid=210
不存在,并继续将(x,y)对转换为EPSG:4326。你知道吗我认为有两种方法可以解决这个问题(至少目前是这样):
简单的解决方法:强迫一切转化为EPSG:2100(希腊网格)通过在模型定义中定义它:
更复杂的方法:创建自定义异常和接受的srid列表:
SRIDS=[2100, 4326, 3857,...]
,对照该列表检查传入的srid,如果不匹配,则引发自定义异常:my_app/exceptions.py
:my_app/my_test.py
:相关问题 更多 >
编程相关推荐