如何使用Geodjango和Postgres/PostGIS创建不同模式的表?

问题描述 投票:0回答:2

我的问题与此处提出和回答的问题非常相似,使用 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'

感谢您提供的任何支持!

django postgresql django-models postgis geodjango
2个回答
0
投票

使用 geodjango 时指定模式和表名称的方式存在问题,在处理地理空间字段时,命名约定和行为可能/可能与常规 Django 模型不同。

您也许可以将它们括在

''
中,而不是仅仅为了
""
- 这是 sql 表的传统方式。这很可能是问题所在。
.



0
投票

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,它的工作原理就像一个魅力(与你原来的问题具有相同的语法)。

© www.soinside.com 2019 - 2024. All rights reserved.