[英]Admin site uses default database in Django 1.6
我有一个包含多个应用程序的项目,每个应用程序都有自己的数据库。 我有一个能正常工作的routers.py
,可以为每个模型指定正确的数据库。 其中一个应用程序使用django-admin
子站点来管理其模型。
在Django 1.5中一切正常,但是在移至Django 1.6时,我不再能够编辑模型:访问模型的edit
页面时,出现错误“ [SQL Server Native Client 11.0]Login timeout expired
”。
经过一番调查,似乎Django尝试连接到数据库default
,该数据库default
在此项目中仅包含伪数据,因为不应在任何地方使用它。
为什么Django尝试在1.6中连接到default
数据库,而在1.5中却能正常工作? 如何在1.6中解决此问题?
[编辑]
经过更多研究后,我发现Django将装饰器@transaction.atomic
用于其类ModelAdmin
的一些功能。
查看此装饰器的代码,似乎旨在支持使用@transaction.atomic(using)
指定用于此原子事务的数据库别名的可能性,否则,如果仅通过@transaction.atomic
就像在ModelAdmin
Django类中一样,它将使用django.db.utils
定义的DEFAULT_DB_ALIAS
。
我试图覆盖此行为未成功,但使这些功能使用了我想要的数据库别名。
你知道有什么办法吗?
我终于找到了一种强制Django管理员使用我想要的数据库的方法,但这确实很hacky。 如果有人提供更好的解决方案,请发布它。
我创建了一个名为admin_helper.py的文件,在其中我重新定义了在Django代码库中使用@transaction.atomic
装饰器的方法,内容完全相同,并使用了装饰器@transaction.atomic(DATABASE_ALIAS)
告诉Django使用正确的方法。数据库:
DATABASE_ALIAS = 'alias_of_the_database_i_want_to_use'
class ModelAdminCustom(admin.ModelAdmin):
@csrf_protect_m
@transaction.atomic(DATABASE_ALIAS)
def add_view(self, request, form_url='', extra_context=None):
# exact same content as the method defined in django.contrib.admin.options.ModelAdmin
@csrf_protect_m
@transaction.atomic(DATABASE_ALIAS)
def change_view(self, request, object_id, form_url='', extra_context=None):
# exact same content as the method defined in django.contrib.admin.options.ModelAdmin
@csrf_protect_m
@transaction.atomic(DATABASE_ALIAS)
def delete_view(self, request, object_id, extra_context=None):
# exact same content as the method defined in django.contrib.admin.options.ModelAdmin
class MultiDBUserAdmin(UserAdmin):
@sensitive_post_parameters_m
@csrf_protect_m
@transaction.atomic(DATABASE_ALIAS)
def add_view(self, request, form_url='', extra_context=None):
# exact same content as the method defined in django.contrib.auth.admin.UserAdmin
# Unregister existing instance of UserAdmin for the User model, and register my own
try:
admin.site.unregister(User)
finally:
admin.site.register(User, MultiDBUserAdmin)
然后在我的普通admin.py中:
from myapp.admin_helper import ModelAdminCustom
class MyModelAdmin(ModelAdminCustom):
pass
admin.site.register(MyModel, MyModelAdmin)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.