Django指定非default数据库仍访问默认库报错求助
问题描述
我正在创建一个基于访问客户端的动态数据库API,测试阶段在settings.py中手动配置了两个数据库(test1、test2),将default设为空字典;视图中通过queryset = Enderecos.objects.using('test1').all()指定查询集,但POST数据时出现ImproperlyConfigured错误,提示settings.DATABASES配置不当需提供ENGINE值。若将test1重命名为default并移除using则可正常运行,但这不符合无默认数据库的设计需求,请问该问题的原因是什么?
相关代码
settings.py 数据库配置
DATABASES = { 'default': {}, 'test1': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'model_base1', 'USER': 'root', 'PASSWORD': '123', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': {'charset': 'utf8mb4'}, }, 'test2': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'model_base2', 'USER': 'root', 'PASSWORD': '123', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': {'charset': 'utf8mb4'}, }, }
视图代码
from rest_framework import generics from cadastro.models.enderecos import Enderecos from cadastro.serializers.enderecos import EnderecosSerializer class EnderecoListarCriarAPIView(generics.ListCreateAPIView): queryset = Enderecos.objects.using('test1').all() serializer_class = EnderecosSerializer
报错信息
ImproperlyConfigured at /cadastro/enderecos/ settings.DATABASES is improperly configured. Please supply the ENGINE value. Check settings documentation for more details.
问题原因
Django的ListCreateAPIView处理POST创建请求时,内部调用的序列化器save()方法默认会使用**默认数据库(default)**执行写入操作,不会继承你在queryset里指定的using('test1')配置。
你的default数据库是个空字典,缺少ENGINE等核心配置项,所以当Django尝试用它写入数据时,直接触发了配置错误。而GET请求能正常工作,是因为你已经在queryset里明确指定了查询用的数据库,但POST的写入逻辑走了默认数据库的分支。
解决办法
要让写入操作也指定目标数据库,需要重写视图的perform_create方法,明确指定使用的数据库:
class EnderecoListarCriarAPIView(generics.ListCreateAPIView): queryset = Enderecos.objects.using('test1').all() serializer_class = EnderecosSerializer def perform_create(self, serializer): # 指定使用test1数据库保存数据 serializer.save(using='test1')
如果该模型所有操作都固定使用某个数据库,也可以在模型类中定义默认数据库:
class Enderecos(models.Model): # 模型字段定义... def _get_db(self): return 'test1' class Meta: managed = False db_table = 'enderecos'
内容的提问来源于stack exchange,提问作者Arcyde
相关产品推荐
相关产品推荐

