【发布时间】:2015-05-25 17:46:07
【问题描述】:
我正在一个包含多个数据库的 django 项目中工作,我正在寻找一种使用导入或方法获取当前数据库别名的方法。
我一直在搜索文档,但没有找到任何有用的信息。
【问题讨论】:
标签: python django django-models django-orm
我正在一个包含多个数据库的 django 项目中工作,我正在寻找一种使用导入或方法获取当前数据库别名的方法。
我一直在搜索文档,但没有找到任何有用的信息。
【问题讨论】:
标签: python django django-models django-orm
在 Django 中并不完全有“当前”数据库别名。
查看 db 路由器的文档以了解原因:
https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#database-routers
(尽管@fasouto 确实正确显示了“当前”别名,但在特定模型的读取操作上下文中,通过使用 QuerySet 的私有 API)
试试这个:
from django.db import router
alias_for_read = router.db_for_read(MyModelClass)
# optionally:
alias_for_read = router.db_for_read(MyModelClass, instance=my_model_instance)
# similarly:
alias_for_write = router.db_for_write(MyModelClass)
alias_for_write = router.db_for_write(MyModelClass, instance=my_model_instance)
关于instance 参数... db 路由器类的规范说它们应该接受**hints kwargs。他们还声明目前唯一支持的提示是instance。但除非您有一个使用此提示的自定义路由器类,否则您不需要提供当前实例。
【讨论】:
如果您有 QuerySet,您可以使用 db property 检索数据库名称:
>>> f = Item.objects.all()
>>> f.db
'default'
如果您有模型实例(您评估了 QuerySet),您可以查询 ModelState(请注意,这没有记录,因此将来可能会更改,并且不建议在应用程序中使用 @Weier 说的) :
>>> f = Item.objects.all()[4]
>>> f._state.db
'default'
【讨论】: