如何将Django与MongoDB Atlas连接?执行makemigrations遇报错
Django连接MongoDB Atlas执行makemigrations报错:NotImplementedError(Database对象不能用布尔判断)
环境版本
django==4.0 Python==3.10.12 djongo==1.3.6 pymongo==4.7.3
数据库配置(settings.py)
DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': 'syscandb', 'ENFORCE_SCHEMA': False, 'CLIENT': { 'host': 'mongodb+srv://<user>:<senha>@clusterak.mp9ylv1.mongodb.net/syscandb?retryWrites=true&w=majority' } } }
报错信息
(venv) rkart@rkart-B-ON:/home/jobs/micakes/syscan$ python3 manage.py makemigrations No changes detected Traceback (most recent call last): File "/home/jobs/micakes/syscan/manage.py", line 24, in <module> main() File "/home/jobs/micakes/syscan/manage.py", line 20, in main execute_from_command_line(sys.argv) File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 425, in execute_from_command_line utility.execute() File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/django/core/management/__init__.py", line 419, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/django/core/management/base.py", line 386, in run_from_argv connections.close_all() File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/django/db/utils.py", line 213, in close_all connection.close() File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/django/utils/asyncio.py", line 25, in inner return func(*args, **kwargs) File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/django/db/backends/base/base.py", line 305, in close self._close() File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/djongo/base.py", line 208, in _close if self.connection: File "/home/jobs/micakes/syscan/venv/lib/python3.10/site-packages/pymongo/database.py", line 1342, in __bool__ raise NotImplementedError( NotImplementedError: Database objects do not implement truth value testing or bool(). Please compare with None instead: database is not None
问题原因
djongo 1.3.6版本的djongo/base.py文件中,_close方法使用了if self.connection:的布尔判断逻辑,但pymongo 4.x及以上版本已修改Database对象实现,禁止直接做布尔判断,必须通过is not None来比较,两者版本不兼容导致报错。
解决方案
方案1:降级pymongo到兼容版本
卸载当前高版本pymongo,安装djongo 1.3.6支持的3.x系列版本:
pip uninstall pymongo pip install pymongo==3.12.3
方案2:修改djongo源代码修复判断逻辑
找到虚拟环境中djongo/base.py文件(路径示例:venv/lib/python3.10/site-packages/djongo/base.py),定位到_close方法,将布尔判断改为None比较:
原代码:
def _close(self): if self.connection: self.connection.client.close()
修改为:
def _close(self): if self.connection is not None: self.connection.client.close()
额外配置优化(可选)
结合你测试成功的连接串,可在数据库配置的CLIENT中添加authSource参数,确保权限验证正常:
DATABASES = { 'default': { 'ENGINE': 'djongo', 'NAME': 'syscandb', 'ENFORCE_SCHEMA': False, 'CLIENT': { 'host': 'mongodb+srv://<user>:<senha>@clusterak.mp9ylv1.mongodb.net/syscandb?retryWrites=true&w=majority', 'authSource': 'admin' } } }
内容的提问来源于stack exchange,提问作者SrKartcheski
相关产品推荐
相关产品推荐

