Add compatibility with Python 3.

Review Request #9582 — Created Feb. 4, 2018 and submitted — Latest diff uploaded

Information

Django Evolution
master
5336ba3...

Reviewers

This introduces Python 3 compatibility for Django Evolution. Most of the
work needed for compatibility has been introduced in prior commits, and
this change handles the remaining syntactical and string differences.

One of the highlights is that the default Pickle protocol changed
(twice) in Python 3. We now force usage of protocol 0, which is an
ASCII-based payload format and the default in Python 2.

There's also a difference in default string types used for Django field
names. Unless otherwise explicitly set, field names (used for indexes
and other parts of the schema definitions) are based on the attribute
name in the model, which on Python 2 is a byte string and on Python 3 is
a unicode string. To get the right string type on each Python version,
we convert the names to the native string type using str(). We don't
want or need to actually encode or decode -- str() is the most
compatible way here.

The rest of the changes mostly have to do with exception handling, print
statements, and removing/adding prefixes on certain string types.

There's still work that's needed on getting all the management commands
fully tested. That will be part of upcoming changes.

Unit tests pass on Django 1.6 through 1.11, with all database types.

Tested Python 3.4, 3.5, and 3.6 with Django 1.6, 1.7, and 1.11 (aiming
to test a spectrum of the changes).