2011-07-13 75 views
4

Django:1.3; PyCharm:1.5.3为什么导入django设置两次,运行单元测试时创建两次测试数据库?

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

无论何时我尝试使用Point对象创建并保存模型实例,我都遇到了GEOS_ERROR(GEOS_ERROR:几何必须是Point或LineString)。很明显,Point对象确实在模型的get_or_create函数中传递。并且可以保存相同的模型,而在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

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

+2

我也很感兴趣看到这个解释,因为我也注意到了这一点,尽管它幸运地没有给我带来任何问题。 – mockobject

+0

这不会导致我在测试应用程序中不需要使用GEOS支持/创建的几何列的其他模块时遇到任何问题。所以我有强烈的怀疑几何字段不能保存,因为这个数据库错误,但我不能证明或测试:(:) –

+0

这是(是?)一个已知的问题,谷歌:Django设置两次导入。我认为自Django 1.4双重加载不会再发生 – n3storm

回答

0

这很可能是因为您在导入路径中同时包含settings.py和contains包。由于这些设置可以在不同的模块(设置和myproject.settings)下导入,因此可以执行两次。

只要确保你总是使用DJANGO_SETTINGS_MODULE =设置,而不是DJANGO_SETTINGS_MODULE = myproject.settings或含有settings.py

或者,更好的目录中删除__init__.py文件,升级到1.4的Django