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

Django创建UTJUser实例报错:Manager无法通过实例访问

问题

我是Django新手,使用Django v5.0.1和psycopg2 v2.2.9,尝试将用户数据存入PostgreSQL数据库。我在models.py中定义了如下UTJUser模型:

from django.db import models

# Create your models here.

# this is the model for each user
class UTJUser(models.Model):
    full_name = models.CharField(max_length=80, default=None)
    email = models.EmailField(default=None)
    password = models.CharField(max_length=200, default=None)
    verified = models.BooleanField(default=False)
    date_created = models.DateTimeField(auto_now_add=True)
    last_submission = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.full_name

并在views.py中编写了异步的sign_up视图函数:

from django.http import HttpResponse
# for development purpose exempt csrf protection
from django.views.decorators.csrf import csrf_exempt
from users.models import UTJUser


# sign up function, use csrf exempt for development
@csrf_exempt
async def sign_up(request):
    try:
        full_name, email, password = request.POST['full_name'], request.POST['email'], request.POST['password']
        new_user = UTJUser(full_name=full_name,email=email,password=password)
        await new_user.save()
        return HttpResponse("Sign up success!")
    except:
        return HttpResponse.status_code

执行new_user = UTJUser(full_name=full_name,email=email,password=password)时,出现错误:

Traceback (most recent call last):
  File "c:\Users\micha\.vscode\extensions\ms-python.python-2023.22.1\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_resolver.py", line 189, in _get_py_dictionary
    attr = getattr(var, name)
           ^^^^^^^^^^^^^^^^^^
  File "c:\Users\micha\Documents\UTJ\backend\UTJEnv\Lib\site-packages\django\db\models\manager.py", line 186, in __get__
    raise AttributeError(
AttributeError: Manager isn't accessible via UTJUser instances

最初还有异常处理中返回HttpResponse.status_code导致的"AttributeError: 'int' object has no attribute 'get'"错误,该问题已修正,但第一个错误在移除await后仍然存在。请问这是什么问题?

解答

错误本质

这个错误不是new_user = UTJUser(...)代码本身的问题,而是VS Code的debugpy调试器在检查模型实例属性时触发的。Django规定模型管理器(默认是objects)只能通过模型类(比如UTJUser.objects)访问,不能通过模型实例调用,但调试器会自动遍历实例的所有属性,尝试获取objects时就抛出了这个异常。实际代码运行时不会触发该错误,只是调试阶段的干扰信息。

解决步骤

  1. 直接忽略调试提示:继续运行代码,验证用户数据是否能正常写入数据库,这个错误不影响业务逻辑执行。
  2. 配置调试器适配Django:在VS Code的launch.json中添加"django": true,让调试器正确识别Django模型结构,避免误触发错误。示例配置:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Django",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/manage.py",
            "args": ["runserver"],
            "django": true
        }
    ]
}
  1. 修正异步视图的保存逻辑:psycopg2是同步数据库驱动,若要在异步视图中操作数据库,需替换为支持异步的psycopg(v3+)。同时Django异步模型保存需使用asave()方法,而非同步的save():
await new_user.asave()

额外优化建议

  • 不要明文存储密码:用Django内置的加密函数处理密码:
from django.contrib.auth.hashers import make_password

new_user = UTJUser(
    full_name=full_name,
    email=email,
    password=make_password(password)
)
  • 细化异常处理:避免用except:捕获所有异常,针对具体场景处理:
except KeyError:
    return HttpResponse("缺少必填字段", status=400)
except Exception as e:
    return HttpResponse(f"注册失败: {str(e)}", status=500)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:25:24