python - Django 中的单模型动态数据库设置

标签 python django

例如,假设我有 100 个使用 WordPress 的客户,并且我必须在 Django 中编写一项服务,该服务应从 WordPress 的 MySQL 数据库返回帖子列表。问题是 100 个客户端具有不同的数据库连接设置。

我知道我可以使用DatabaseRouter来切换设置中已加载的数据库。但是我不知道如何创建单一模型类来使用不同的数据库设置。

  • 我尝试过更改设置。
  • 我还尝试了改变模型的 app_label

但后来我明白,在 Django 中改变任何内容都没有什么意义。

我的要求

我想创建一个模型并动态更改数据库连接。连接列表可以位于托管数据库表中。但我不想不必要地加载所有连接设置或创建多个模型。

最佳答案

我做了类似的事情,但是要更改 mongodb 连接。 我创建了一个 GenericView,它选择连接并在 get_queryset 上使用它。

我正在使用 django Rest 框架,所以我做了这样的事情:

class SwitchDBMixinView(object):
    model = None
    fields = None

    def initial(self, request, *args, **kwargs):
        result = super().initial(request, *args, **kwargs)
        if request.user.is_authenticated():
            request.user.database_connection.register()
        return result

    def get_object(self, *args, **kwargs):
        return super().get_object(*args, **kwargs).switch_db(self.get_db_alias())

    def get_db_alias(self):
        if self.request is None or not self.request.user.is_authenticated():
            return DEFAULT_CONNECTION_NAME
        return self.request.user.database_connection.name

    def get_queryset(self):
        return self.model.objects.using(self.get_db_alias()).all()

    def perform_destroy(self, instance):
        instance.switch_db(self.get_db_alias()).delete()

型号:

from mongoengine.connection import register_connection, get_connection
AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL')

class Connection(models.Model):
    class Meta:
        pass

    owner = models.OneToOneField(
        AUTH_USER_MODEL,
        related_name='database_connection',
    )

    uri = models.TextField(
        default=DefaultMongoURI()
    )

    def register(self):
        register_connection(
            self.name,
            host=self.uri,
            tz_aware=True,
        )
        get_connection(
            self.name,
            reconnect=True
        )

    def get_name(self):
        return 'client-%d' % self.owner.pk

    name = property(get_name)

    def __str__(self):
        return self.uri

关于python - Django 中的单模型动态数据库设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47136680/

相关文章:

python - Ruby on Rails 开发人员应该如何开始学习 Python Django

python - 仅允许用户访问一个字段 - Django

Django,过滤当前登录用户以多对多模型形式呈现的集合

python - 如何在 django TestCase 中使用 pytest 固定装置

Python 链接拉取器

python - bluemix 上的授权问题 : Python swift client library accessing object storage

python - 列表不可散列,但元组可散列?

python - 查找 C 风格注释的正则表达式

python - 如何以 Google App Engine 的形式表示多对多关系?

Django 的 Javascript 日期格式