采用这个模型:
<div class="switch">
<label>
<input type="checkbox">
<span class="lever"></span> <span>Option Unchecked</span>
</label>
</div>
<div class="switch">
<label>
<input type="checkbox" checked>
<span class="lever"></span> <span>Option Checked</span>
</label>
</div>
<div class="switch">
<label>
<input type="checkbox" disabled>
<span class="lever"></span> <span>Option Disabled</span>
</label>
</div>
<div class="switch">
<label>
<input type="checkbox" disabled checked>
<span class="lever"></span> <span>Option Checked and disabled</span>
</label>
</div>
然后尝试执行此操作,故意给它一个错误的SRID:
from django.contrib.gis.db import models
class Location(models.Model):
point = models.PointField(null=True, blank=True)
执行最后一个语句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()
后,控制台上会显示消息“unknown SRID:210”。到现在为止还挺好。问题是some_location.save()
成功返回,null存储在.save()
中;但我想要的是没有任何东西可以保存,也可以提出异常。
Django似乎将此SQL发送到了spaceite:
point
和spatialite似乎执行它(控制台上印有警告),而没有告诉Django出错了。
如何判断spatialite失败并在SRID错误时返回错误?
答案 0 :(得分:0)
On GeoDjango Database API documentation声明:
此外,如果GEOSGeometry在不同的坐标系中(具有不同的SRID值),那么它将使用空间数据库的转换过程隐式转换为模型字段的SRID。
在BaseSpatialField
上,PointField
的基础,默认的srid设置为4326.它会警告您srid=210
不存在并继续转换( x,y)配对EPSG:4326。
我看到两种方法可以解决这个问题(至少目前):
简单易行:通过在模型定义中定义,强制所有内容转换为EPSG:2100(希腊网格):
class Location(models.Model):
point = models.PointField(null=True, blank=True, srid=2100)
(更简单)更复杂的方式:创建自定义异常和已接受的SRID列表:SRIDS=[2100, 4326, 3857,...]
,检查该列表中的传入srid以及它是否为' t匹配,引发自定义异常:
my_app/exceptions.py
:
class UnknownSRID(Exception):
def __init__(self, message=None):
self.message = message
my_app/my_test.py
:
from django.conf import settings
from django.contrib.gis.geos import Point
from testpoint.exceptions import UnknownSRID
from testpoint.models import Location
some_location = Location()
test_srid=210
if test_srid not in settings.SRIDS:
raise UnknownSRID(
'SRID {} not in list of acceptable SRIDs'.format(test_srid)
)
some_location.point = Point(x=15, y=16, srid=test_srid)
some_location.save()