66π
The Django 3.0.0 release notes specify that certain private Python 2 compatibility APIs were removed. Among those was django.utils.six
.
For this error specifically, @WillemVanOnsem noted that the module corsheaders
was referencing this module.
For others encountering this same thing, looking at the file path on the last line of the stack trace can help with identifying the problematic module. Another example of this Iβve seen is:
...
File "/path/to/project/venv/lib/python3.8/site-packages/parler/utils/conf.py", line 10, in <module>
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path/to/project/venv/lib/python3.8/site-packages/django/utils/__init__.py)
The module causing the issue, in this case, was parler
. I hope this helps any others who encounter this issue.
95π
Why this error/exception?
From django-3.0release notes,
django.utils.six
β Remove usage of this vendored library or switch to six.
means, django.utils.six
module was removed from django-3.0 onwards.
My codebase isnβt using "django.utils.six
" module, then why this error?
This import error could be raised because of two reasons,
- Most importantly, any of your installed packages are using the
django.utils.six
module - or maybe your codebase using the
django.utils.six
module
NOTE: Most of the time the first reason is the villain ππ
How can I identify which package is causing the error/exception?
The easy way is, look into your last few lines of error traceback, and it will tell you which package is causing the exceptions.
Examples
Corsheaders
In this example, corsheaders
module caused the the import error
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/__init__.py", line 1, in
from .checks import check_settings # noqa: F401
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in
from django.utils import six
Example-2
In this example, jsonfield
module caused the the import error
File "d:\production\myproject\venv\lib\site-packages\jsonfield\fields.py", line 21, in
from .encoder import JSONEncoder
File "d:\production\myproject\venv\lib\site-packages\jsonfield\encoder.py", line 2, in
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)
Example-3
In this example parler
module caused the import error
...
File "/path/to/project/venv/lib/python3.8/site-packages/parler/utils/conf.py", line 10, in
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path/to/project/venv/lib/python3.8/site-packages/django/utils/__init__.py)
Example-4
In this example django_mysql
module caused the import error
File "/home/jerin/.virtualenvs/webscraperio/lib/python3.6/site-packages/django_mysql/checks.py", line 9, in
from django_mysql.utils import collapse_spaces
File "/home/jerin/.virtualenvs/webscraperio/lib/python3.6/site-packages/django_mysql/utils.py", line 17, in
from django.utils import six
ImportError: cannot import name 'six'
What is the solution?
If the error raised because of some third-party packages like django-cors-headers
,django-jsonfield
, etc upgrade the corresponding package versions to latest versions. If you are already using the latest version, report an issue with the developer.
If the error raised because from your codebase, use six package instead of django.utils.six
module
- [Django]-Django count RawQuerySet
- [Django]-How to convert a Django QuerySet to a list?
- [Django]-Where's my JSON data in my incoming Django request?
66π
Install this library: django-utils-six
2.0 for Django >= 3.
pip install django-utils-six
- [Django]-Django Queryset with year(date) = '2010'
- [Django]-Django ManyToMany filter()
- [Django]-Django Rest Framework β Authentication credentials were not provided
30π
First, install six from pip
pip install six
Second, call six
from six import text_type
For me works, I have Django 3.0.4
- [Django]-Having Django serve downloadable files
- [Django]-How to use permission_required decorators on django class-based views
- [Django]-Does django with mongodb make migrations a thing of the past?
24π
As mentioned by Mohammad Masoumi, upgrading the packages will resolve the issue because corsheaders
is supporting Django 3.0 now.
pip install --upgrade django-cors-headers
I also upgraded djangorestframework
and drf_yasg
to avoid this ImportError.
- [Django]-How to loop over form field choices and display associated model instance fields
- [Django]-OperationalError: database is locked
- [Django]-When saving, how can you check if a field has changed?
13π
You need to update the cors headers package:
pip3 install six
pip3 install --upgrade django-cors-headers
- [Django]-What is actually assertEquals in Python?
- [Django]-Django: Record with max element
- [Django]-Django Rest JWT login using username or email?
10π
Exception:
File "/usr/local/lib/python3.8/dist-packages/django/core/management/__init__.py", line 377, in execute
django.setup()
File "/usr/local/lib/python3.8/dist-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/usr/local/lib/python3.8/dist-packages/django/apps/registry.py", line 114, in populate
app_config.import_models()
File "/usr/local/lib/python3.8/dist-packages/django/apps/config.py", line 211, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
File "<frozen importlib._bootstrap>", line 991, in _find_and_load
File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 783, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/usr/local/lib/python3.8/dist-packages/django_celery_beat/models.py", line 6, in <module>
import timezone_field
File "/usr/local/lib/python3.8/dist-packages/timezone_field/__init__.py", line 1, in <module>
from timezone_field.fields import TimeZoneField
File "/usr/local/lib/python3.8/dist-packages/timezone_field/fields.py", line 5, in <module>
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/usr/local/lib/python3.8/dist-packages/django/utils/__init__.py)
Solution:
vi /usr/local/lib/python3.8/dist-packages/timezone_field/fields.py
Change:
from django.utils import six
To:
import six
- [Django]-Django: How to get related objects of a queryset?
- [Django]-Django F() division β How to avoid rounding off
- [Django]-Error: could not determine PostgreSQL version from '10.3' β Django on Heroku
6π
I had the same problem.
My issue was using:
pip install django_taggit==0.22.2
I resolved this when I did:
pip install django_taggit==1.2.0
because that is the latest version.
- [Django]-Django β How to rename a model field using South?
- [Django]-"gettext()" vs "gettext_lazy()" in Django
- [Django]-Negating a boolean in Django template
6π
Folksβ ideal solution is an upgrade and clean usage, but a workaround for folks in dire straits is simple enough.
In Django
utils create a new file six.py and inside the file put:
import six
NOTE: Not a solution but a workaround for immediate patching
- [Django]-How to run a celery worker with Django app scalable by AWS Elastic Beanstalk?
- [Django]-Add inline model to django admin site
- [Django]-Iterate over model instance field names and values in template
5π
There are a number of libraries and add-ons to Django that use django.utils.six, which of course are now broken. The main one of concern is mysql-connector-python (8.0.18). The simple solution is to use the library external to Django, but the authors of these libraries will need to make their changes (or you could temporarily make the changes yourselfβ¦.replace django.utils.six with six).
- [Django]-Custom django admin templates not working
- [Django]-Pagination in Django-Rest-Framework using API-View
- [Django]-Chained method calls indentation style in Python
5π
I resolved this issue by installing a higher version of corsheader
package.
corsheader
v3.3.0 supports Django 3.0.x
django-cors-headers==3.3.0
- [Django]-Django order_by query set, ascending and descending
- [Django]-Django Passing Custom Form Parameters to Formset
- [Django]-Django storages: Import Error β no module named storages
3π
JSONField Solution:
I used jsonfield
and jsonfiled2
packages. But in both cases, I faced the same error.
My problem solved when I have installed django-jsonfield
package and uninstall the rest of the packages (related to jsonfield).
# In case you have installed the following packages, otherwise ignore them.
pip uninstall jsonfield
pip uninstall jsonfield2
pip install django-jsonfield
Usage:
from django.db import models
from jsonfield import JSONField
class ModelName(models.Model):
json_field = JSONField()
- [Django]-Django MEDIA_URL and MEDIA_ROOT
- [Django]-How to express a One-To-Many relationship in Django?
- [Django]-Django β Rotating File Handler stuck when file is equal to maxBytes
2π
I had the exact same problem. Let me tell you how I solved it (fortunately it was simple to do).
So, whatβs going on?
You have to pay attention to the traceback Django is telling you (pro tip: start from the bottom):
File "/path-to-project/project/venv/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
from django.utils import six
ImportError: cannot import name 'six' from 'django.utils' (/path-to-project/project/venv/lib/python3.7/site-packages/django/utils/init.py)
It tells you two important things:
- Whatβs going on:
ImportError: cannot import name 'six' from 'django.utils'
- Where itβs happening:
/lib/python3.7/site-packages/corsheaders/checks.py", line 7, in <module>
It is first telling you it cannot import the six
module from django.utils
, which is quite logical since Django has deprecated the module in Django 3.0.
Now you may ask:
- but hey, I wasnβt using that module!!
- Youβre right, but a dependency was π
- Which dependency?
- Iβm glad you askedβ¦
This one ==> /lib/python3.7/site-packages/corsheaders/checks.py
, corsheaders
was importing the module here: from django.utils import six
in checks.py
(in line 7).
Whatβs the solution?
This issue is generally solved by updating the package that created the problem in the first place. They probably removed that import and replaced it with something else, if necessary.
Go to the command line and type:
pip install corsheaders -U
What generated the problem?
Django stopped supporting Python 2. Since django.utils.six
provided "Utilities for writing code that runs on Python 2 and 3", it was not longer necessary to support this module, so it was deprecated in Django 3.
- [Django]-Malformed Packet: Django admin nested form can't submit, connection was reset
- [Django]-What is reverse()?
- [Django]-How to assign items inside a Model object with Django?
2π
Django six is not available for Django versions higher than django2, so a quick fix is to install it via pip:
pip install django-utils-six
Then you should be good to go
- [Django]-How to access Enum types in Django templates
- [Django]-Django project models.py versus app models.py
- [Django]-How exactly do Django content types work?
1π
If the error raised because of some third-party packages and you are already using the latest version, report an issue with the developer. If you did that but you really need a urgent fix, this strategy could make the third party package happy:
try:
# six removed since Django 3.0
from django.utils import six
except ImportError:
import six
import sys
sys.modules["django.utils.six"] = six
# similarly for any other six sub-module required:
sys.modules["django.utils.six.moves"] = six.moves
# finally, import the outdated third-party package below:
import outdated_library
- [Django]-Filtering dropdown values in django admin
- [Django]-How does django handle multiple memcached servers?
- [Django]-Combining Django F, Value and a dict to annotate a queryset
0π
As I understand, You just need to delete tokens.py
file at all
if You have a greater version of Django.
And remove all imports from .tokens
in other files such as views.py
as well.
- [Django]-How to show processing animation / spinner during ajax request?
- [Django]-Are Django SECRET_KEY's per instance or per app?
- [Django]-Is there a way to loop over two lists simultaneously in django?
0π
FYI I got this same error from using the package django-braces
. I had used Conda to install it: conda install -c conda-forge django-braces
. By default as of the time of this answer (Jan 24, 2023) conda-forge installs version 1.13 of django-braces
, which gives rise to the "cannot import βsixβ from django.utils" error.
To fix it, I did the following:
conda remove django-braces
pip install django-braces
This removes django-braces
v1.13 and replaces it with v1.15, which solves the problem. Happy django-ing everyone.
- [Django]-Django AutoField with primary_key vs default pk
- [Django]-Django Template Language: Using a for loop with else
- [Django]-How to add multiple objects to ManyToMany relationship at once in Django ?