﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
32584	OrderBy.as_sql() overwrites template	Tim Nyborg	nobody	"A change in 3.1 has caused OrderBy.as_sql() in django.db.models.expressions to ignore sql templates provided by db backends when nulls_first or nulls_last is set:

  
{{{
  def as_sql(self, compiler, connection, template=None, **extra_context):
        template = template or self.template
        if connection.features.supports_order_by_nulls_modifier:
            if self.nulls_last:
                template = '%s NULLS LAST' % template
            elif self.nulls_first:
                template = '%s NULLS FIRST' % template
        else:
            if self.nulls_last and not (
                self.descending and connection.features.order_by_nulls_first
            ):
                template = '%%(expression)s IS NULL, %s' % template
            elif self.nulls_first and not (
                not self.descending and connection.features.order_by_nulls_first
            ):
                template = '%%(expression)s IS NOT NULL, %s' % template
}}}

Note that template is always overwritten if nulls_first == True.  In 3.0, the function first tested for template == None.

This causes trouble for the MSSQL 3rd party driver, which provides its own order by functionality:
https://github.com/microsoft/mssql-django/issues/19

The following change (simply testing for template) fixed the issue for me (forked off 3.1 as I'm on py 3.7)
https://github.com/timnyborg/django/commit/fd41b39ade8d37138951223eba7f2e3fb66d0d1c"	Uncategorized	new	Database layer (models, ORM)	3.1	Normal		order_by, nulls_first		Unreviewed	1	0	0	0	0	0
