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
相关产品推荐
相关产品推荐

