Django 2.0.3报错:'Manager'对象无'objects'属性,环境一致为何异常?
这种情况我之前踩过好几次坑!明明代码和虚拟环境都对齐了,不同环境却出奇怪的错误,大概率是环境配置或运行时上下文的差异搞的鬼,给你列几个最可能的原因:
变量
ob的赋值出了问题(最常见)
你报错的AttributeError: 'Manager' object has no attribute 'objects',本质是调用ob.objects.create()时,ob本身已经是一个Manager实例(比如MyModel.objects),而不是模型类本身(MyModel)。
为什么两个环境会有差异?可能是:- 脚本里有条件分支(比如根据环境变量判断),另一个环境触发了错误的分支,把
ob赋值成了Model.objects而不是Model; - 导入路径问题:比如另一个环境中,你导入的不是模型类,而是某个导出了Manager实例的模块;
可以在报错前加一行print(type(ob))验证——开发环境里ob的类型应该是<class 'django.db.models.base.ModelBase'>,出问题的环境会是<class 'django.db.models.manager.Manager'>。
- 脚本里有条件分支(比如根据环境变量判断),另一个环境触发了错误的分支,把
Django运行上下文未正确初始化
如果你的脚本是独立运行的(不是通过manage.py shell或manage.py runscript),必须手动初始化Django环境。有可能开发环境里IDE自动帮你做了这个操作,但另一个环境没配置:import os import django os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings') django.setup()没做这一步的话,模型的Manager可能无法正确初始化,引发属性异常。
虚拟环境未正确激活(或全局Django干扰)
虽然你说虚拟环境一致,但有可能另一个环境里你没激活虚拟环境,导致系统全局的Django版本被调用了——哪怕版本号接近,某些底层实现的差异也可能引发这种奇怪的错误。可以在脚本开头加print(django.__version__),对比两个环境的版本是否完全一致。缓存或字节码残留
Git同步了代码,但旧的.pyc文件或__pycache__文件夹可能还留在另一个环境里,导致Python加载的是旧的模型代码。试试删除项目根目录下的所有__pycache__文件夹和.pyc文件,然后重新运行脚本。数据库迁移未同步
虽然代码里的模型是对的,但另一个环境的数据库可能没执行最新的迁移,导致Django ORM在映射模型时出现异常。可以在两个环境分别运行python manage.py showmigrations,检查迁移是否完全应用。
内容的提问来源于stack exchange,提问作者deMangler

