Django 1.0.2中的多个数据库,带有自定义管理器

Jus*_*ade 6 django django-models

我在用户组中问这个没有回复,所以我想我会在这里试试.我正在尝试设置一个自定义管理器连接到与我的默认mysql连接相同的服务器上的另一个数据库.我试过这里这里的例子,但没有运气.回来时我得到一个空元组 MyCustomModel.objects.all().

这是我在manager.py中的内容

from django.db import models 
from django.db.backends.mysql.base import DatabaseWrapper 
from django.conf import settings 
class CustomManager(models.Manager): 
    """ 
    This Manager lets you set the DATABASE_NAME on a per-model basis. 
    """ 
    def __init__(self, database_name, *args, **kwargs): 
        models.Manager.__init__(self, *args, **kwargs) 
        self.database_name = database_name 
    def get_query_set(self): 
        qs = models.Manager.get_query_set(self) 
        qs.query.connection = self.get_db_wrapper() 
        return qs 
    def get_db_wrapper(self): 
        # Monkeypatch the settings file. This is not thread-safe! 
        old_db_name = settings.DATABASE_NAME 
        settings.DATABASE_NAME = self.database_name 
        wrapper = DatabaseWrapper() 
        wrapper._cursor(settings) 
        settings.DATABASE_NAME = old_db_name 
        return wrapper 
Run Code Online (Sandbox Code Playgroud)

这是我在models.py中的内容:

from django.db import models 
from myproject.myapp.manager import CustomManager 
class MyCustomModel(models.Model): 
    field1  = models.CharField(max_length=765) 
    attribute = models.CharField(max_length=765) 
    objects = CustomManager('custom_database_name') 
    class Meta: 
        abstract = True 
Run Code Online (Sandbox Code Playgroud)

但如果我跑,MyCustomModel.objects.all()我得到一个空列表.

我对这些东西很新,所以我不确定这是否适用于1.0.2,我将查看Manager代码,看看我是否能解决它,但我只是想知道我是否在这里做错了.

更新:现在在Django主干中,将成为1.2版本的一部分 http://docs.djangoproject.com/en/dev/topics/db/multi-db/

小智 4

您可能想与Alex Gaynor交谈,因为他正在添加 MultiDB 支持,并且可能会在Django 1.2中发布。我确信他会感谢那些将要使用 MultiDB 的人的反馈和意见。在django-developers mainling 列表中有关于它的讨论。他的 MultiDB 分支甚至可能可用,我不确定。

因为我猜您可能已经等不及了,如果 MultiDB 分支不可用,那么以下是您的选择。

  • 遵循Eric Flows 方法,请记住它不受支持,新发布的 Django 可能会破坏它。另外,一些评论表明它已经被破坏了。这会很麻烦。
  • 您的另一种选择是对您的数据库之一使用完全不同的数据库访问方法。也许是SQLAlchemy,然后是 Django ORM。我猜测一个可能更以 Django 为中心,另一个是遗留数据库。

总结一下。我认为将 MultiDB 侵入 Django 可能是错误的方法,除非您准备好稍后维护您的 hack。因此,我认为另一个 ORM 或数据库访问将为您提供最干净的路线,因为这样您就不会使用受支持的功能,最终,它只是 Python。