首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PointField geography=True无法保存数据: SQL函数错误

PointField geography=True无法保存数据: SQL函数错误
EN

Stack Overflow用户
提问于 2020-11-02 15:25:08
回答 1查看 497关注 0票数 0

我有一个带有地理信息系统扩展的Django 3.1.2PostgreSQL 12PostGIS 3

在我的模型中,我试图使用PointFieldgeography=True来存储真实世界的坐标:

代码语言:javascript
复制
location = models.PointField(geography=True, srid=4326, blank=False, null=False, verbose_name=_("Lat/Lon coordinates"))

在管理菜单中,我使用OSMWidget输入坐标:

代码语言:javascript
复制
location = forms.PointField(widget=forms.OSMWidget(attrs={'map_width': 800, 'map_height': 500, 'default_zoom': 15}))

保存它时,Django会遇到以下SQL错误:

代码语言:javascript
复制
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,则用作数据类型)。但我不确定要让它和地理一起工作需要什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-03 09:35:55

因为您重写了PointField,所以它没有srid集,ST_Transform用于将geom转换为正确的空间引用。

有几种方法可以正确地更改小部件,但我将为您提供当前代码中最简单的方法:

代码语言:javascript
复制
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。
  • 仅使用ModelForm元类覆盖小部件。工作方式类似于前一次。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64648376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档