【问题标题】:Django model instance getattr in multiple database landscape多数据库环境中的 Django 模型实例 getattr
【发布时间】:2019-01-17 06:24:11
【问题描述】:

我有多个数据库环境,数据库中有"default": {}。我不需要任何默认数据库,并按照 django 文档中的建议进行此操作以保持一致性。

数据库设置如下:

DATABASES = {
    'default': {},
    'mydb': {
        'ENGINE': 'django.db.backends.mysql', 
        ...
    },
    'mydb2': {
        'ENGINE': 'django.db.backends.mysql', 
        ...
        }
    }

我也有一些 Model1 与 FK 相关的 Model2,像这样:

class Model1(models.Model):
    name = models.CharField(max_length=50)
    related_field = models.ForeignKey( 
        "Model2",
        db_index=True, 
        null=True, blank=True,
        on_delete=models.SET_NULL)

class Model2(models.Model):
    name = models.CharField(max_length=50)

现在我正在与奇怪的行为作斗争:在其中一个数据库中有 Model1 的实例,我想从 Model2 中获取相关实例,我使用:

inst1 = Model1.objects.using("mydb").get(...) # this sets inst1._state.db to "mydb
related = getattr(inst1, "related_field")

并获取ImproperlyConfigured: settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.

因此,而不是尊重 inst1._state.db 底层 ForwardManyToOneDescriptor().__get__ 方法使用“默认”数据库初始化管理器,这会导致此异常。

我试图为此创建通用函数的丑陋解决方法是:

from django.apps import apps

related_model = apps.get_model(inst1._meta.app_label, inst1._meta.model_name)
related_object = related_model.objects.using(inst1._state.db).get(...)

有什么办法可以让getattr(instance,relatedFK)关注instance._state_db?

【问题讨论】:

  • 您能否用相关的设置文件内容更新您的问题?
  • 添加数据库信息

标签: django database


【解决方案1】:

DATABASES 设置必须配置默认数据库;还可以指定任意数量的附加数据库。

我们必须提供一个默认数据库,所以你可以这样做:

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    ...
  },
  'mydb': {
    'ENGINE': 'django.db.backends.mysql',
    ...
  },
  'mydb2': {
    'ENGINE': 'django.db.backends.mysql',
    ...
  }
}

参考:https://docs.djangoproject.com/en/2.0/ref/settings/#databases

【讨论】:

猜你喜欢
  • 2020-03-14
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2013-06-11
  • 2014-09-17
  • 2013-09-04
相关资源
最近更新 更多