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 ?

Lua
fonte
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] .

Willem Van Onsem
fonte
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.

Debdipta Halder
fonte
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
3

Um especificado na nota de versão do Django 3.0 , django.utils.sixé removido. No caso de você precisar dele, é aconselhável a utilização pacotes PyPI vez

No seu caso, o jsonfieldpacote pode ser substituído pelo campo JSON do Django nativo . Outra solução seria jsonfieldenviar um pacote para resolver seu problema ou fazer um PR no repo do projeto '

Julien Kieffer
fonte