Django PointField,地理位置=真can';无法保存数据:SQL函数错误
我有一个安装了GIS扩展的Django PointField,地理位置=真can';无法保存数据:SQL函数错误,django,gis,geospatial,postgis,Django,Gis,Geospatial,Postgis,我有一个安装了GIS扩展的Django 3.1.2,PostgreSQL 12和PostGIS 3 在我的模型中,我试图使用PointField和geography=True来存储真实世界的坐标: location = models.PointField(geography=True, srid=4326, blank=False, null=False, verbose_name=_("Lat/Lon coordinates")) location = forms.Poi
Django 3.1.2
,PostgreSQL 12
和PostGIS 3
在我的模型中,我试图使用PointField
和geography=True
来存储真实世界的坐标:
location = models.PointField(geography=True, srid=4326, blank=False, null=False, verbose_name=_("Lat/Lon coordinates"))
location = forms.PointField(widget=forms.OSMWidget(attrs={'map_width': 800, 'map_height': 500, 'default_zoom': 15}))
在管理菜单中,我使用OSMWidget输入坐标:
location = models.PointField(geography=True, srid=4326, blank=False, null=False, verbose_name=_("Lat/Lon coordinates"))
location = forms.PointField(widget=forms.OSMWidget(attrs={'map_width': 800, 'map_height': 500, 'default_zoom': 15}))
保存后,Django会遇到以下SQL错误:
INSERT INTO "challenges_point" ("track_id", "sortkey", "name", "location") VALUES (15, 10, 'Start', ST_Transform(ST_GeogFromWKB('\x...'::bytea), 4326)) RETURNING "challenges_point"."id";
ERROR: function st_transform(geography, integer) does not exist
LINE 1: ...", "location") VALUES (15, 10, 'Start', ST_Transfo...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
ST_Transform()
用于变换几何体点(如果geography=False
用于点域,则将其用作数据类型)。但我不确定需要什么才能使其与地理相关。因为您覆盖了PointField,它没有srid集,并且使用ST_Transform将geom转换为正确的空间参考
有几种方法可以正确更改小部件,但我将用当前代码为您提供最简单的方法:
location=forms.PointField(
srid=4326,
widget=forms.OSMWidget(
属性={'map\u width':800,'map\u height':500,'default\u zoom':15}
)
)
其他方法包括:
- 扩展并更改
form_class.widget
到OSMWidget
- 实现并仅指定小部件属性。这是因为您不必覆盖整个字段,而只需覆盖特定属性,默认值将来自上面的
Model.formfield()
,这将正确设置srid
- 仅使用覆盖小部件。其工作方式与前一个类似
您能尝试将srid=4326添加到表单字段吗?您的意思是:“forms.OSMWidget(attrs={'srid':4326,'map\u width':800…”我添加了这个,但结果相同。