加载django-municipios地理数据fixture时AttributeError的解决方法
解决Django loaddata导入地理数据时的AttributeError问题
你执行python manage.py loaddata municipios_geo_2013_4674.json.bz2或python manage.py loaddata municipios_geo_2013_4674.json时遇到的AttributeError: 'DatabaseOperations' object has no attribute 'Adapter'错误,本质是Django的GIS数据库适配层出了问题,下面是具体的排查和解决步骤:
1. 检查数据库引擎配置(最常见原因)
这个错误大概率是因为你在settings.py里用了普通的数据库引擎,而非GIS专用引擎:
- 若使用PostgreSQL+PostGIS,需修改数据库引擎配置:
DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', # NAME、USER、PASSWORD等其他配置保持不变 } } - 若用SQLite仅作开发测试,生产环境不推荐,需改成:
'ENGINE': 'django.contrib.gis.db.backends.sqlite3'
普通的django.db.backends.postgresql或django.db.backends.sqlite3不支持GIS字段处理,因此会出现找不到Adapter的错误。
2. 确认GIS依赖已正确安装
- 若使用PostgreSQL:
- 安装依赖包:
pip install psycopg2-binary - 登录PostgreSQL数据库,执行
CREATE EXTENSION postgis;启用GIS扩展
- 安装依赖包:
- 确保Django的GIS模块已加入
INSTALLED_APPS:INSTALLED_APPS = [ # 其他已注册的app... 'django.contrib.gis', 'municipios', # 别忘了加入django-municipios的应用 ]
3. 检查django-municipios与Django版本的兼容性
从错误回溯来看,你使用的是Python 3.5和Django 1.x系列,需确保安装的django-municipios版本与当前Django版本兼容。可以查看该包的版本历史,安装适配的版本,例如:
pip install django-municipios==<兼容的版本号>
4. 重新迁移数据库(修改配置后)
修改完数据库引擎和INSTALLED_APPS后,需要重新执行迁移,确保GIS相关表结构正确创建:
python manage.py makemigrations python manage.py migrate
之后再尝试执行loaddata命令导入数据。
附完整错误回溯信息:
Traceback (most recent call last): File "manage.py", line 22, in <module> execute_from_command_line(sys.argv) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line utility.execute() File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv self.execute(*args, **cmd_options) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute output = self.handle(*args, **options) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/management/commands/loaddata.py", line 69, in handle self.loaddata(fixture_labels) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/management/commands/loaddata.py", line 109, in loaddata self.load_label(fixture_label) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/management/commands/loaddata.py", line 175, in load_label obj.save(using=self.using) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/core/serializers/base.py", line 205, in save models.Model.save_base(self.object, using=using, raw=True, **kwargs) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/db/models/base.py", line 837, in save_base updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/db/models/base.py", line 904, in _save_table forced_update) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/db/models/base.py", line 954, in _do_update return filtered._update(values) > 0 File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/db/models/query.py", line 664, in _update return query.get_compiler(self.db).execute_sql(CURSOR) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1191, in execute_sql cursor = super(SQLUpdateCompiler, self).execute_sql(result_type) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 863, in execute_sql sql, params = self.as_sql() File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/db/models/sql/compiler.py", line 1157, in as_sql val = field.get_db_prep_save(val, connection=self.connection) File "/Users/lidiane/Developer/django/integra-fundaj/.myvenv/lib/python3.5/site-packages/django/contrib/gis/db/models/fields.py", line 182, in get_db_prep_save return connection.ops.Adapter(self.get_prep_value(value)) AttributeError: Problem installing fixture '/Users/lidiane/Developer/django/integra-fundaj/municipios_geo_2013_4674.json': 'DatabaseOperations' object has no attribute 'Adapter'
内容的提问来源于stack exchange,提问作者LSM
相关产品推荐
相关产品推荐

