You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:23:19