Obtener error no puede importar el nombre 'seis' de 'django.utils' cuando se usa la última versión de Django 3.0.0

8

Actualmente he actualizado la versión de Django 2.2 a 3.0 y de repente recibo un error como el siguiente.

ImportError: no se puede importar el nombre 'seis' de 'django.utils'

He comprobado que Traceback es como a continuación.

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)

He revisado la carpeta Lib \ site-packages \ django \ utils y no he encontrado el archivo six.py pero todavía desde Lib \ site-packages \ jsonfield \ encode.py que contiene la línea de django.utils import six, zona horaria que intenta importar seis pero no puede encontrar.

Versión anterior de django que contiene el archivo six.py en la carpeta Lib \ site-packages \ django \ utils.

Alguna idea de como resolver esto ?

Luna
fuente
2
Es su jsonfieldpaquete el que necesita un módulo en Django que ya no se puede encontrar.
Willem Van Onsem
¿Qué base de datos estás usando?
Julien Kieffer
Como se documenta en las notas de la versión , "django.utils.six - Elimine el uso de esta biblioteca vendida o cambie a seis".
Sayse
@WillemVanOnsem - ¿Qué debo hacer para arreglar esto? Alguna idea porque he instalado la última versión de todos los paquetes.
Luna

Respuestas:

6

Respuesta corta : es posible que desee abandonar django-jsonfield.

Según el rastreo, está utilizando el django-jsonfieldpaquete [GitHub] , y este es un problema conocido [GitHub-issue] . Depende del django.utils.sixmódulo, pero ese módulo se ha eliminado en .

Por el momento, no puede usar con , y dado que el último compromiso con este proyecto es a partir de octubre de 2017, tal vez el proyecto ya no esté tan "activo" y, por lo tanto, podría llevar mucho tiempo (o incluso nunca) arreglarse. El sucesor de es ([GitHub]) . Se hizo compatible con mediante una solicitud de extracción en octubre (2019) [GitHub-pr] .

Willem Van Onsem
fuente
1
jsonfield2 parece una solución mucho mejor en este momento. Gracias amigo.
Luna
Disculpe, ¿cómo exactamente abandonar django-jsonfield?
Phok Chanrithisak
Para cualquiera que encuentre esto hoy, jsonfield2se ha archivado y fusionado en jsonfield( GitHub ).
Greg Kaleka
5

para usar los seis módulos, puede instalarlo directamente usando pip y luego modificar el paquete django-jsonfield en consecuencia. Lo que quiero decir es encontrar los archivos en el paquete donde los hay from django.utils import sixy reemplazarlos con import six. Entonces debería estar funcionando. Me enfrenté al mismo problema al usar djongo con django 3.0. Encontré el archivo respectivo y lo reemplacé con la sugerencia anterior. Tenga en cuenta que nunca se recomienda hacer esto si está trabajando en un proyecto de nivel de producción o de empresa. Lo hice para mi proyecto de mascota.

Debdipta Halder
fuente
esto funcionó para mí
Irfan Harun
¡Esta fue la solución para mí también! Gracias. Espero que esto no destruya mi aplicación en entornos de producción en Heroku.
José Luis Quichimbo
3

A especifica en Django liberación 3.0 nota , django.utils.sixse elimina. En caso de que necesite que, se aconseja el uso de paquetes PyPI vez

En su caso, el jsonfieldpaquete puede ser reemplazado por el campo JSON nativo de Django . Otra solución sería bifurcarse jsonfieldpara resolver su problema, o hacer un RP en el repositorio del proyecto '

Julien Kieffer
fuente