4

姜戈:1.3;PyCharm:1.5.3

我正在为使用 GEOS 保存 Point 对象的 Django 应用程序编写单元测试。对于本地测试,我按照 GeoDjango 文档定制 Spatialite 后端的每一步。

每当我尝试使用 Point 对象创建和保存模型实例时,都会遇到 GEOS_ERROR(GEOS_ERROR:几何必须是 Point 或 LineString)。很明显,模型的 get_or_create 函数中确实传递了一个 Point 对象。并且可以在shell中毫无问题地保存相同的模型。

没有过多研究导致此错误的代码,我发现每次运行单元测试时,Django 都会导入设置,创建一个测试数据库并立即销毁该数据库,然后再次为最终的测试创建测试数据库会抛出错误。

Testing started at 5:09 PM ...<br />
Importing Django settings module settings
SpatiaLite version ..: 2.4.0    Supported Extensions:
    - 'VirtualShape'    [direct Shapefile access]
    - 'VirtualText'[direct CSV/TXT access]
    - 'VirtualNetwork   [Dijkstra shortest path]
    - 'RTree'       [Spatial Index - R*Tree]
    - 'MbrCache'        [Spatial Index - MBR cache]
    - 'VirtualFDO'      [FDO-OGR interoperability]
    - 'SpatiaLite'      [Spatial SQL - OGC]
PROJ.4 Rel. 4.7.1, 23 September 2009
GEOS version 3.3.0-CAPI-1.7.0Creating test database 'default'...
Destroying old test database 'default'...
SpatiaLite version ..: 2.4.0    Supported Extensions:
(same Spatialite settings again)
cannot start a transaction within a transaction
cannot rollback transaction - SQL statements in progress
Syncing...
Creating tables ...

我怀疑这是由 PyCharm 引起的。但是,当我从终端 shell 运行“python manage.py test”时,重复了相同的过程并引发了相同的错误。

我检查了我的设置文件,但找不到为什么它提示自己被导入两次以及为什么测试数据库被创建了两次。创建 Spatialite 数据库所需的 init_spatialite-2.*.sql 也在项目路径中。

任何建议将不胜感激!

更新:JetBrains 通知我,在 runserver 期间两次导入 settings.py 可以通过此补丁或 runserver --noreload 修复。 http://code.djangoproject.com/changeset/15911

但是,对于测试任务,导入错误仍然存​​在。

4

1 回答 1

0

这很可能是因为您在导入路径上同时拥有 settings.py 和包含包。因为可以在不同的模块(settings 和 myproject.settings)下导入设置,所以可以执行两次。

只需确保您始终使用 DJANGO_SETTINGS_MODULE=settings 而不是 DJANGO_SETTINGS_MODULE=myproject.settings 或从包含 settings.py 的目录中删除 __init__.py 文件

或者,更好的是,升级到 django 1.4

于 2013-03-25T00:19:53.223 回答