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:
这样就能把app4的表结构正确创建到python manage.py migrate app4 --database=new_dbnew_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
相关产品推荐
相关产品推荐

