2
votes

Django TypeError: l'argument de type 'PosixPath' n'est pas itérable

J'utilise la dernière version de django django 2.2.12

J'ai essayé de vérifier les erreurs avant la migration avec la commande

python3 manage.py check

mais alors il jette l'erreur ci-dessous

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


4 commentaires

On dirait que vous avez spécifié un paramètre de base de données avec un objet Path , convertissez-le en str() .


Je n'ai rien fait de tel. J'ai vu quelques changements dans le django 2.2.12 où ils ont remplacé le module os par le module pathlib. Je suppose que cela cause le problème. J'ouvre mon fichier settings.py pour que vous m'aidiez avec lui


@AlexHall J'ai tenu compte de votre solution et je l'ai convertie en une chaîne qui a fonctionné pour moi. Merci de votre aide


OK, j'ai fait une réponse pour que les gens puissent voir que cela a été résolu. Il peut être bon d'afficher la partie pertinente de vos paramètres au cas où d'autres personnes rechercheraient cette erreur.


4 Réponses :


1
votes

On dirait que vous avez spécifié un paramètre de base de données avec un objet Path , convertissez-le en str() .


0 commentaires

1
votes

si vous utilisez le modèle startproject de Django 3.1. vous devez utiliser la fonction str () dans votre fichier de paramètres.

trouver ce code dans le fichier de paramètres

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

changez-le en:

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

ou vous pouvez utiliser os.path.join (BASE_DIR, 'db.sqlite3'),


0 commentaires

0
votes

Je viens de rencontrer cela par surprise moi-même. Je générais une série de projets Django en 3.1.3 en dehors d'un environnement virtuel et j'ai effectué une installation rapide de pip qui a ramené mes besoins Django à 3.05. Les paramètres de configuration précédents ressemblaient à ceci

"""                                                                                                  
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__))) 

et après l'installation, les scripts ./manage.py suivants ont soudainement commencé à me donner cette même trace. La reconstruction de mon projet a configuré mes paramètres pour ressembler à ceci:

"""                                                                                                  
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 

Quel était le bout. Il semble que le script de génération de paramètres détecte quand votre environnement est mieux adapté à un mécanisme de construction de chemin ou à l'autre.

Malheureusement, enrouler str () autour des chemins m'a permis d'émettre quelques commandes ./manage sans erreur, mais je ne pouvais plus lancer le serveur dans aucun autre projet que j'ai créé sans tracebacks bien pires.

Je me demande s'il y a quelque chose comme un> pip revert --time = -2hrs.

J'ai fini par désinstaller les deux dernières installations de paquets et j'ai fait une installation explicite de Django 3.1.3 pour revenir là où j'étais. temps de gel de pip.


0 commentaires

4
votes

Assurez-vous que vous avez importé le système d' exploitation dans settings.py au niveau du projet:

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

Ajoutez ce qui suit dans DATABASES dans settings.py:

import os


0 commentaires