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

Django控制器方法中的时区错误求助

问题:Django视图手动替换数据库连接引发时区相关AttributeError

问题场景

视图函数blog_detail中手动创建psycopg数据库连接,并替换Django默认数据库连接后,加载视图时出现错误:

def blog_detail(request, pk):
    post = Post.objects.get(pk=pk)

    conn = psycopg.connect(
        host="localhost",
        dbname="myproject2",
        user="postgres",
        password=""
    )

    from django.db import connections
    connections['default'].connection = conn

    form = comment_form()
    if request.method == 'POST':
        form = comment_form(request.POST)
        if form.is_valid():
            comment = Comments(
                author=form.cleaned_data["author"],
                body=form.cleaned_data["body"],
                post=post
            )
            comment.save()

    comments = Comments.objects.filter(post=post)
    context = {
        "post": post,
        "comments": comments,
        "form": form
    }
    return render(request, "blog_detail.html", context)

错误信息

".../base.py", line 336, in create_cursor
if self.timezone != tzloader.timezone:
AttributeError: type object 'TimestamptzLoader' has no attribute 'timezone'

相关代码与配置

模型定义

class Category(models.Model):
    name = models.CharField(max_length=20)

class Post(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    categories = models.ManyToManyField('Category', related_name='posts')

class Comments(models.Model):
    author = models.CharField(max_length=60)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    post = models.ForeignKey('Post', on_delete=models.CASCADE)

settings.py相关配置

TIME_ZONE = 'UTC'
USE_TZ = True

PostgreSQL配置说明

已将postgresql.conf中的时区从Europe/London改为UTC,但错误仍存在。

问题原因

手动替换Django的connections['default'].connection会绕过Django内置的数据库连接初始化流程,其中包含时区配置的绑定逻辑,导致Django处理时区时找不到预期的属性。

解决方法

方法1:移除手动创建连接的代码(推荐)

Django会自动根据settings.py中的DATABASES配置管理数据库连接,无需手动创建psycopg连接。直接删除视图中手动创建连接的代码段,确保settings.py的数据库配置正确:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'myproject2',
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '',
    }
}

方法2:手动补全Django连接初始化逻辑(仅特殊场景使用)

若因特殊需求必须手动管理连接,需让Django完成连接的初始化工作:

from django.db import connections
from django.db.backends.postgresql.base import DatabaseWrapper

conn = psycopg.connect(
    host="localhost",
    dbname="myproject2",
    user="postgres",
    password=""
)

# 初始化Django数据库连接包装器
wrapper = DatabaseWrapper(connections['default'].settings_dict, 'default')
wrapper.connection = conn
wrapper.set_autocommit(True)
# 手动触发连接状态初始化,包含时区配置
wrapper.init_connection_state()

# 替换默认连接
connections['default'] = wrapper

此方法可能引发其他隐藏问题,优先使用方法1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:21