You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DRF项目无需DATABASE_ROUTERS实现多库访问的方法咨询

无需数据库路由实现app4独立访问new_db的方法

1. 显式指定数据库参数(最直接的方式)

所有针对app4模型的数据库操作,都通过using参数明确指定new_db:

  • 查询数据:App4Model.objects.using('new_db').all()
  • 创建并保存数据:
    obj = App4Model(field1="test")
    obj.save(using='new_db')
    
  • 删除数据:obj.delete(using='new_db')

2. 为app4指定迁移数据库

默认迁移操作会指向default数据库,这也是你之前创建非默认库表报错的原因,执行迁移时必须指定目标数据库:

  • 生成迁移文件(和常规流程一致):
    python manage.py makemigrations app4
    
  • 执行迁移并指定new_db:
    python manage.py migrate app4 --database=new_db
    
    这样就能把app4的表结构正确创建到new_db中。

3. 自定义模型基类/管理器(简化重复操作)

如果不想每次操作都手动写using,可以通过抽象基类和自定义管理器统一处理:

自定义管理器(默认查询使用new_db)

from django.db import models

class NewDBManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().using('new_db')

抽象基类(默认保存/删除使用new_db)

class App4BaseModel(models.Model):
    objects = NewDBManager()
    
    class Meta:
        abstract = True
    
    def save(self, *args, **kwargs):
        # 自动设置using为new_db,除非显式指定其他数据库
        kwargs.setdefault('using', 'new_db')
        super().save(*args, **kwargs)
    
    def delete(self, *args, **kwargs):
        kwargs.setdefault('using', 'new_db')
        super().delete(*args, **kwargs)

之后app4的所有模型直接继承这个抽象基类即可:

class App4Model(App4BaseModel):
    field1 = models.CharField(max_length=100)
    # 其他字段定义...

注意:app_label的作用是标记模型所属的应用,和数据库路由没有关系,所以你之前设置app_label不会改变模型使用的数据库。

内容的提问来源于stack exchange,提问作者Aroosh Rana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:26