Django TypeError:“PosixPath”类型的参数不可迭代

Posted

技术标签:

【中文标题】Django TypeError:“PosixPath”类型的参数不可迭代【英文标题】:Django TypeError: argument of type 'PosixPath' is not iterable 【发布时间】:2021-02-14 11:14:05 【问题描述】:

我正在使用最新版本的 django django 2.2.12

我尝试在迁移前使用命令检查错误

python3 manage.py check

然后它会抛出下面的错误

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python3/dist-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python3/dist-packages/django/core/management/base.py", line 336, in run_from_argv
    connections.close_all()
  File "/usr/lib/python3/dist-packages/django/db/utils.py", line 224, in close_all
    connection.close()
  File "/usr/lib/python3/dist-packages/django/db/backends/sqlite3/base.py", line 248, in close
    if not self.is_in_memory_db():
  File "/usr/lib/python3/dist-packages/django/db/backends/sqlite3/base.py", line 367, in is_in_memory_db
    return self.creation.is_in_memory_db(self.settings_dict['NAME'])
  File "/usr/lib/python3/dist-packages/django/db/backends/sqlite3/creation.py", line 12, in is_in_memory_db
    return database_name == ':memory:' or 'mode=memory' in database_name
TypeError: argument of type 'PosixPath' is not iterable

【问题讨论】:

听起来您使用Path 对象指定了一个数据库设置,将其转​​换为str() 我没有做过这样的事情。我在 django 2.2.12 中看到了一些变化,他们用 pathlib 模块替换了 os 模块。我想这是造成问题的原因。我正在调出我的 settings.py 文件,以便您帮助我处理它 @AlexHall 我听取了您的解决方案并将其转换为对我有用的字符串。感谢您的帮助 好的,我已经做了一个回答,以便人们可以看到这个问题已经解决了。如果其他人搜索此错误,最好显示设置的相关部分。 【参考方案1】:

确保您在项目级 settings.py 中导入了 os

import os

在 settings.py 的 DATABASES 中添加以下内容:

'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

在 django 的最新版本中,我们可以使用 str() 进行以下设置:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': str(BASE_DIR / "db.sqlite3"),
    

【讨论】:

【参考方案2】:

我正在使用Ubuntu 20.04python 3.8.5Django 3.0.5。在安装djongo 包以使用MongoDB 后,我遇到了同样的错误,同样的错误但原因不同,但是,我能够通过将 BASE_DIR / 'db.sqlite3' 转换为字符串

str(BASE_DIR / 'db.sqlite3')

【讨论】:

【参考方案3】:

我使用 Python 3.7 和 Django 3.1.5 在 Ubuntu 20.04 中创建了一个新的 Django 项目。当我运行./manage.py migrate./manage.py makemigrations 时。我在原始问题中得到错误。我发现切换到 Python 3.8 可以修复错误。

【讨论】:

【参考方案4】:

我自己只是意外地遇到了这个问题。我在虚拟环境之外的 3.1.3 中生成了一系列 Django 项目,并进行了快速 pip 安装,将我的 Django 要求降低到 3.05。早期的配置设置是这样的

"""                                                                                                  
Django settings for config project.                                                                                                                                                                  
Generated by 'django-admin startproject' using Django 3.1.3.                                         
"""                                                                                                     
from pathlib import Path                                                                             
                                                                                                     
# Build paths inside the project like this: BASE_DIR / 'subdir'.                                     
BASE_DIR = Path(__file__).resolve().parent.parent 

在安装之后,随后的 ./manage.py 脚本突然开始给我同样的回溯。重建我的项目将我的设置配置为如下所示:

"""                                                                                                  
Django settings for config project.                                                                                                                                                                      
Generated by 'django-admin startproject' using Django 3.0.5.                                         
"""                                                                                                  
                                                                                                     
import os                                                                                            
                                                                                                     
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)                              
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

这是小费。设置生成脚本似乎检测到您的环境何时更适合一种路径构建机制或另一种。

不幸的是,将 str() 包裹在路径周围允许我发出一些 ./manage 命令而不会出错,但我无法再在我创建的任何其他项目中启动服务器,而没有更糟糕的回溯。

我想知道是否有类似 > pip revert --time=-2hrs 的东西。

我最终卸载了最后几个软件包安装并进行了明确的 Django 3.1.3 安装以回到我原来的位置。点冻结时间。

【讨论】:

【参考方案5】:

如果你使用 Django 3.1 的 startproject 模板。 您必须在设置文件中使用 str() 函数。

在设置文件中找到此代码

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    

改成:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': str(BASE_DIR / "db.sqlite3"),
    

或者你可以使用 os.path.join(BASE_DIR, 'db.sqlite3'),

【讨论】:

应该/ 是一个字符串吗? @Code-Apprentice: / 在这里不是字符串,因为BASE_DIR 是(假设是)来自pathlib 模块的Path 对象,该模块将/ 运算符重载为将Path 连接到另一个Path 或字符串。【参考方案6】:

听起来您使用Path 对象指定了一个数据库设置,请将其转换为str()

【讨论】:

以上是关于Django TypeError:“PosixPath”类型的参数不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

Django TypeError - TypeError: issubclass() arg 1 必须是一个类

Django:“TypeError:[] 不是 JSON 可序列化的”为啥?

Django 预览,TypeError:'str' 对象不可调用

Django异常中间件:TypeError:object()不带参数

Django ConnectionAbortedError + TypeError + AttributeError

Django - TypeError:“方法”类型的对象没有 len()