我的问题与此处提出和回答的问题非常相似,使用 Meta 类和 db_table = 'schema"."tablename' 方法来使用多个模式: 如何在 django 中创建不同模式的表?
这个解决方案在标准 Django 项目框架下对我有用(使用 django.db 模型);但是,当我尝试在 Geodjango 项目中使用此方法(使用 django.contrib.gis.db 模型)时,在尝试迁移包含地理空间字段(PointField、LineStringField 和 PolygonField)的模型时收到以下错误:
django.db.utils.ProgrammingError: syntax error at or near "."
LINE 1: CREATE INDEX "schema"."tablename_geom_point_id" ON "sch...
如何使用 Geodjango 来实现这种方法,以直接在模型中利用架构的优势?
下面给出了我尝试并导致错误消息的示例代码。
模型.py
import uuid
from django.contrib.gis.db import models
class TableName(models.Model):
id = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False)
...
geom_point = models.PointField(blank=True, null=True)
geom_line = models.LineStringField(blank=True, null=True)
geom_polygon = models.PolygonField(blank=True, null=True)
...
class Meta:
managed = True
db_table = 'schema"."tablename'
感谢您提供的任何支持!
使用 geodjango 时指定模式和表名称的方式存在问题,在处理地理空间字段时,命名约定和行为可能/可能与常规 Django 模型不同。
您也许可以将它们括在
''
中,而不是仅仅为了 ""
- 这是 sql 表的传统方式。这很可能是问题所在。.
Django 试图创建一个地理索引,将架构/表名称添加到索引名称之前。例如,类似
from django.contrib.gis.db import models
class TableName(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# ...
geom_point = models.PointField(blank=True, null=True)
geom_line = models.LineStringField(blank=True, null=True)
geom_polygon = models.PolygonField(blank=True, null=True)
# ...
class Meta:
managed = True
db_table = 'schema.tablename'
之类的东西。正如文档中所述,这确实是 postgreSQL 不允许的。
它似乎已在最近的 django 版本上修复了。我刚刚接触到 django 5.1.3,它的工作原理就像一个魅力(与你原来的问题具有相同的语法)。