September 1, 2020
Django 3.1.1 fixes two security issues and several bugs in 3.1.
On Python 3.7+,
FILE_UPLOAD_DIRECTORY_PERMISSIONS mode was not
applied to intermediate-level directories created in the process of uploading
files and to intermediate-level collected static directories when using the
collectstatic management command.
You should review and manually fix permissions on existing intermediate-level directories.
On Python 3.7+, the intermediate-level directories of the file system cache had
the system's standard umask rather than
0o077 (no group or others
select_for_update(). When using related fields pointing to a proxy model in the
ofargument, the corresponding model was not locked (#31866).
process_response()hooks when in an async context (#31905).
__inlookup on key transforms for
JSONFieldwith MariaDB, MySQL, Oracle, and SQLite (#31936).
settings.pygenerated by the
startprojectcommand, when user didn't have permissions to all intermediate directories in a Django installation path (#31912).
get_responsecallable in various builtin middlewares (#31928).
QuerySet.order_by()crash on PostgreSQL when ordering and grouping by
JSONFieldwith a custom
decoder(#31956). As a consequence, fetching a
JSONFieldwith raw SQL now returns a string instead of pre-loaded data. You will need to explicitly call
json.loads()in such cases.
QuerySet.delete()crash on MySQL, following a performance regression in Django 3.1 on MariaDB 10.3.2+, when filtering against an aggregate function (#31965).
django.contrib.admin.EmptyFieldListFiltercrash when using on reverse relations (#31952).