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时就抛出了这个异常。实际代码运行时不会触发该错误,只是调试阶段的干扰信息。
解决步骤
- 直接忽略调试提示:继续运行代码,验证用户数据是否能正常写入数据库,这个错误不影响业务逻辑执行。
- 配置调试器适配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 } ] }
- 修正异步视图的保存逻辑: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
相关产品推荐
相关产品推荐

