You need to enable JavaScript to run this app. Django单应用配置多数据库时数据无法保存到MongoDB问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 13:39:03