Django单应用配置多数据库时数据无法保存到MongoDB问题求助
Django多库写入MongoDB失败解决方案
问题根因
- 未配置多数据库路由,Django无法正确识别多库操作规则
- 序列化器第一次调用
save()后实例已生成主键,第二次调用save()默认执行更新逻辑,不会插入新数据到MongoDB - Djongo连接配置缺失,无法正常连接MongoDB实例
- 模型主键类型不兼容,Django默认整数主键和MongoDB默认ObjectId类型不匹配
解决方案
步骤1:修正settings.py数据库配置
DATABASES = { # 设定PostgreSQL为默认库 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'my_db', 'USER': '******', 'PASSWORD': '***', 'HOST': 'localhost', 'PORT': '5432', }, 'mongodb':{ 'ENGINE': 'djongo', 'NAME': 'mongo_db', # 补充MongoDB连接参数,有认证需求可新增username、password配置 'CLIENT': { 'host': 'localhost', 'port': 27017, } } } # 新增多数据库路由配置 DATABASE_ROUTERS = ['todo.db_router.TaskRouter']
步骤2:新增多数据库路由规则
在todo应用目录下新建db_router.py文件:
class TaskRouter: def db_for_read(self, model, **hints): if model._meta.app_label == 'todo' and model.__name__ == 'Task': # 读操作默认走PostgreSQL,可按需调整 return 'default' return None def db_for_write(self, model, **hints): if model._meta.app_label == 'todo' and model.__name__ == 'Task': return 'default' return None def allow_relation(self, obj1, obj2, **hints): return True def allow_migrate(self, db, app_label, model_name=None, **hints): if app_label == 'todo' and model_name == 'task': # 仅允许PostgreSQL执行migrate,MongoDB无需执行Django迁移 return db == 'default' return None
步骤3:修正视图写入逻辑
避免序列化器重复save触发更新,重置主键后强制插入MongoDB:
@api_view(['POST']) def todoCreate(request): serializer = TodoSerializer(data=request.data) if serializer.is_valid(): # 写入PostgreSQL task_instance = serializer.save() # 重置主键,强制插入新记录到MongoDB task_instance.pk = None task_instance.save(using='mongodb', force_insert=True) return Response(serializer.data)
步骤4:验证生效
- 执行
python manage.py migrate为PostgreSQL创建Task表 - 调用接口测试,可分别检查PostgreSQL的task表和MongoDB的task集合是否均有新数据写入
内容的提问来源于stack exchange,提问作者bashar pazhedath
相关产品推荐
相关产品推荐

