Django PointField,地理位置=真can';无法保存数据:SQL函数错误

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

我有一个安装了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.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…”我添加了这个,但结果相同。