我有一个带有地理信息系统扩展的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"))在管理菜单中,我使用OSMWidget输入坐标:
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,则用作数据类型)。但我不确定要让它和地理一起工作需要什么。
发布于 2020-11-03 09:35:55
因为您重写了PointField,所以它没有srid集,ST_Transform用于将geom转换为正确的空间引用。
有几种方法可以正确地更改小部件,但我将为您提供当前代码中最简单的方法:
location = forms.PointField(
srid=4326,
widget=forms.OSMWidget(
attrs={'map_width': 800, 'map_height': 500, 'default_zoom': 15}
)
)其他方式有:
Model.formfield()并将form_class.widget更改为OSMWidget。ModelAdmin.formfield_overrides,并且只指定小部件属性。这是因为您不需要覆盖整个字段,而只需要覆盖特定的属性,缺省值将来自上面的Model.formfield(),它正确地设置了srid。https://stackoverflow.com/questions/64648376
复制相似问题