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

Django settings配置namedtuple变量报Settings无SCHEMA_VERSION错误如何解决?

问题原因及解决方法

1 首要问题:配置未被Django加载导致属性不存在

你遇到的AttributeError: 'Settings' object has no attribute 'SCHEMA_VERSION'报错,首先是因为Django没有加载到你定义的SCHEMA_VERSION变量,排查方向:

  • 确认你将SCHEMA_VERSION的定义写在了Django加载的配置文件(通常是项目根目录下的settings.py)中,Django的django.conf.settings只会加载DJANGO_SETTINGS_MODULE环境变量指向的模块的顶层变量,如果你写在其他独立py文件中,不会自动同步到settings对象里。
  • 确认运行Django时没有通过--settings参数指定其他配置文件,覆盖了包含SCHEMA_VERSION定义的默认配置。

2 核心逻辑错误:decouple config用法不符合需求

你现在的用法完全混淆了decouple.config的作用:
config()函数的作用是从环境变量、.env文件中读取配置值,而你需要放到settings里的SCHEMA_VERSION是namedtuple类本身(用来后续实例化对象),不需要从环境变量读取,用config()包裹属于逻辑错误。
你现有代码的运行逻辑是:

从环境变量查找SCHEMA_VERSION值,找不到就返回你设置的default=None,最终settings.SCHEMA_VERSION会变成None,就算属性存在,后续调用settings.SCHEMA_VERSION(**result)也会报错,因为None不是可调用对象。

正确写法

直接在settings.py中定义namedtuple类即可:

from collections import namedtuple

SCHEMA_VERSION = namedtuple(
    typename="SCHEMA_VERSION",
    field_names=["subject", "schema_id", "version"],
    defaults=[None, None, None]
)

如果你确实需要从环境变量读取默认的SCHEMA_VERSION实例,可以分开定义:

from collections import namedtuple
from decouple import config

# 先定义要暴露给settings的namedtuple类
SCHEMA_VERSION = namedtuple(
    typename="SCHEMA_VERSION",
    field_names=["subject", "schema_id", "version"],
    defaults=[None, None, None]
)
# 单独配置从环境变量读取的默认实例
DEFAULT_SCHEMA_VERSION = config(
    "SCHEMA_VERSION",
    cast=lambda v: SCHEMA_VERSION(*v.split(",")),
    default=None
)

3 其他代码笔误修正

你在RedisService类中多次把变量arn错写为ran,需要修正,否则会触发NameError报错。


内容的提问来源于stack exchange,提问作者Maciej Krzanowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:57:04