【发布时间】: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?
【问题讨论】:
-
您能否用相关的设置文件内容更新您的问题?
-
添加数据库信息