Bei der Verwendung der neuesten Version von Django 3.0.0 kann der Fehler "Name" nicht aus "django.utils" importiert werden

8

Derzeit habe ich die Version von Django 2.2 auf 3.0 aktualisiert und bekomme plötzlich Fehler wie unten.

ImportError: Name 'Sechs' kann nicht aus 'django.utils' importiert werden

Ich habe überprüft, Traceback ist wie unten.

Traceback (most recent call last):
  File "c:\Users\admin\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\ptvsd_launcher.py", line 43, in <module>
    main(ptvsdArgs)
  File "c:\Users\admin\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432, in main
    run()
  File "c:\Users\admin\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316, in run_file
    runpy.run_path(target, run_name='__main__')
  File "C:\Python37\Lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Python37\Lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Python37\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "D:\production\myproject\erp_project\manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "d:\production\myproject\venv\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "d:\production\myproject\venv\lib\site-packages\django\core\management\__init__.py", line 377, in execute
    django.setup()
  File "d:\production\myproject\venv\lib\site-packages\django\__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "d:\production\myproject\venv\lib\site-packages\django\apps\registry.py", line 92, in populate
    app_config = AppConfig.create(entry)
  File "d:\production\myproject\venv\lib\site-packages\django\apps\config.py", line 90, in create
    module = import_module(entry)
  File "d:\production\myproject\venv\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "d:\production\myproject\venv\lib\site-packages\post_office\__init__.py", line 3, in <module>
    from .backends import EmailBackend
  File "d:\production\myproject\venv\lib\site-packages\post_office\backends.py", line 6, in <module>
    from .settings import get_default_priority
  File "d:\production\myproject\venv\lib\site-packages\post_office\settings.py", line 101, in <module>
    context_field_class = import_attribute(CONTEXT_FIELD_CLASS)
  File "d:\production\myproject\venv\lib\site-packages\post_office\compat.py", line 45, in import_attribute
    module = importlib.import_module(module_name)
  File "d:\production\myproject\venv\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "d:\production\myproject\venv\lib\site-packages\jsonfield\__init__.py", line 1, in <module>
    from .fields import JSONField, JSONCharField  # noqa
  File "d:\production\myproject\venv\lib\site-packages\jsonfield\fields.py", line 21, in <module>
    from .encoder import JSONEncoder
  File "d:\production\myproject\venv\lib\site-packages\jsonfield\encoder.py", line 2, in <module>
    from django.utils import six, timezone
ImportError: cannot import name 'six' from 'django.utils' (d:\production\myproject\venv\lib\site-packages\django\utils\__init__.py)

Ich habe im Ordner Lib \ site-packages \ django \ utils eingecheckt und nicht gefunden und six.py-Datei, aber immer noch aus Lib \ site-packages \ jsonfield \ encode.py mit der Zeile aus django.utils import sechs, Zeitzone, die versucht zu importieren sechs aber nicht in der Lage zu finden.

Frühere Version von django mit der Datei six.py im Ordner Lib \ site-packages \ django \ utils.

Irgendeine Idee, wie man das löst?

Mond
quelle
2
Es ist Ihr jsonfieldPaket, das ein Modul in Django benötigt, das nicht mehr gefunden werden kann.
Willem Van Onsem
Welche Datenbank verwenden Sie?
Julien Kieffer
Wie in den dokumentierten Release Notes „django.utils.six -. Entfernen Nutzung dieser Bibliothek weiterverkauft oder Schalter auf sechs“
Sayse
@ WillemVanOnsem - Was soll ich tun, um dies zu beheben? Irgendeine Idee, weil ich die neueste Version aller Pakete installiert habe.
Mond

Antworten:

6

Kurze Antwort : Vielleicht möchten Sie aufgeben django-jsonfield.

Basierend auf dem Traceback verwenden Sie das django-jsonfieldPaket [GitHub] , und dies ist ein bekanntes Problem [GitHub-Problem] . Es hängt vom django.utils.sixModul ab, aber dieses Modul wurde in .

Im Moment können Sie mit . Da das letzte Commit für dieses Projekt ab Oktober 2017 erfolgt, ist das Projekt möglicherweise nicht mehr so ​​"aktiv" und kann daher sehr lange dauern (oder sogar nie) repariert werden. Der Nachfolger von ist ([GitHub]) . Es wurde durch eine Pull-Anfrage im Oktober (2019) [GitHub-pr] mit kompatibel .

Willem Van Onsem
quelle
1
jsonfield2 sieht momentan nach einer viel besseren Lösung aus. Danke Kumpel.
Mond
Entschuldigung, wie genau soll ich Django-Jsonfield aufgeben?
Phok Chanrithisak
Für alle, die dies heute finden, jsonfield2wurde es archiviert und in jsonfield( GitHub ) zusammengeführt.
Greg Kaleka
5

Um das Sechs-Modul zu verwenden, können Sie es direkt mit pip installieren und dann das django-jsonfield-Paket entsprechend ändern. Ich meine, finde die Dateien in dem Paket, in dem sie sich befinden, from django.utils import sixund ersetze sie durch import six. Dann sollte es funktionieren. Ich hatte das gleiche Problem bei der Verwendung von Djongo mit Django 3.0. Ich habe die entsprechende Datei gefunden und durch den obigen Vorschlag ersetzt. Bitte beachten Sie, dass dies niemals empfohlen wird, wenn Sie an einem Projekt auf Produktions- oder Unternehmensebene arbeiten. Ich habe es für mein Haustierprojekt gemacht.

Debdipta Halder
quelle
das hat bei mir funktioniert
Irfan Harun
Das war auch für mich die Lösung! Vielen Dank. Ich hoffe, dass dies meine App in der Produktionsumgebung in Heroku nicht zerstört.
Jose Luis Quichimbo
3

A in bestimmten Django 3.0 Release-Info , django.utils.sixwird entfernt. Falls Sie es brauchen, wird empfohlen, stattdessen Pypi-Pakete zu verwenden

In Ihrem Fall wird das jsonfieldPaket möglicherweise durch das JSON-Feld von Django ersetzt . Eine andere Lösung wäre, sich jsonfieldselbst zu verpacken, um Ihr Problem zu lösen, oder eine PR für das Repo des Projekts zu erstellen.

Julien Kieffer
quelle