Obter erro não pode importar o nome 'six' de 'django.utils' ao usar a versão mais recente do Django 3.0.0


8

Atualmente eu atualizei a versão do Django 2.2 para 3.0 e de repente obtendo um erro como abaixo.

ImportError: não é possível importar o nome 'six' de 'django.utils'

Eu verifiquei que o Traceback é como abaixo.

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)

Eu verifiquei na pasta Lib \ site-packages \ django \ utils e não encontrei o arquivo six.py, mas ainda em Lib \ site-packages \ jsonfield \ encode.py que contém a linha django.utils import six, fuso horário que está tentando importar seis, mas não é capaz de encontrar.

Versão anterior do django contendo o arquivo six.py na pasta Lib \ site-packages \ django \ utils.

Alguma idéia de como resolver isso ?


2
É o seu jsonfieldpacote que precisa de um módulo no Django que não pode mais ser encontrado.
— Willem Van Onsem

Qual banco de dados você está usando?
— Julien Kieffer

Conforme documentado nas notas de versão , "django.utils.six - remova o uso desta biblioteca vendida ou mude para seis".
— Sayse

@WillemVanOnsem - O que devo fazer para corrigir isso? Alguma idéia, porque eu instalei a versão mais recente de todos os pacotes.
— Lua

Respostas:


6

Resposta curta : você pode querer abandonar django-jsonfield.

Com base no traceback, você está usando o django-jsonfieldpacote [GitHub] , e este é um problema conhecido [GitHub-issue] . Depende do django.utils.sixmódulo, mas esse módulo foi removido no .

No momento, você não pode usar o com o e, como o último commit neste projeto é de outubro de 2017, talvez o projeto não esteja mais "ativo" e, portanto, pode demorar muito tempo. (ou mesmo nunca) seja consertado. O sucessor do é ([GitHub]) . Foi compatível com o por uma solicitação de recebimento em outubro de 2019 [GitHub-pr] .


1
jsonfield2 parece uma solução muito melhor no momento. Obrigado parceiro.
— Lua

Com licença, como exatamente abandonar o django-jsonfield?
— Phok Chanrithisak

Para quem encontrar isso hoje, jsonfield2foi arquivado e mesclado no jsonfield( GitHub ).
— Greg Kaleka em 18/02

5

para usar o módulo seis, você pode instalá-lo diretamente usando pip e modificar o pacote django-jsonfield de acordo. O que quero dizer é encontrar os arquivos no pacote onde houver from django.utils import sixe substituí-los por import six. Então deve estar funcionando. Eu enfrentei o mesmo problema ao usar o djongo com o django 3.0. Encontrei o respectivo arquivo e o substituí pela sugestão acima. Observe que nunca é recomendável fazer isso se você estiver trabalhando em um projeto em nível de produção ou em nível empresarial. Eu fiz isso para o meu projeto de estimação.


Isso funcionou para mim
— Irfan Harun

Esta foi a solução para mim também! Obrigado. Espero que isso não destrua meu aplicativo no ambiente de produção em Heroku.
— Jose Luis Quichimbo

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.