繁体   English   中英

管理站点在Django 1.6中使用默认数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM