Opened 4 years ago
Last modified 4 years ago
#32584 closed Uncategorized
OrderBy.as_sql() overwrites template — at Initial Version
Reported by: | Tim Nyborg | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | 3.2 |
Severity: | Normal | Keywords: | order_by, nulls_first |
Cc: | David Beitey | Triage Stage: | Unreviewed |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
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