Opened 9 years ago

Last modified 3 years ago

#24991 closed Bug

Range types not properly converted to SQL in QuerySet.query.__str__() — at Version 2

Reported by: Villiers Strauss Owned by:
Component: contrib.postgres Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: yes
Easy pickings: no UI/UX: no

Description (last modified by Villiers Strauss)

The string representation of the QuerySet.query object, which is useful in debugging, does not convert range types to their SQL equivalents, instead it just displays the string representation of the range type.

>>> import datetime
>>> from django.utils.timezone import utc
>>> from psycopg.extras import NumericRange, DateRange, DateTimeTZRange
>>> from myapp.models import MyModel  # model defintion is irrelevant

>>> print(MyModel.objects.filter(num_rng__overlap=NumericRange(1, 5)).query)
SELECT [...] FROM "myapp_mymodel" WHERE ("myapp_mymodel"."num_rng" && NumericRange(1, 5, '[)'))

>>> print(MyModel.objects.filter(date_rng__overlap=DateRange(datetime.date(2015, 5, 1), datetime.date(2015, 6, 1))).query)
SELECT [...] FROM "myapp_mymodel" WHERE ("myapp_mymodel"."date_rng" && DateRange(datetime.date(2015, 5, 1), datetime.date(2015, 6, 1), '[)'))

>>> print(MyModel.objects.filter(dt_rng__overlap=DateTimeTZRange(datetime.datetime(2015, 5, 1, tzinfo=utc), datetime.datetime(2015, 6, 1, tzinfo=utc))).query)
SELECT [...] FROM "myapp_mymodel" WHERE ("myapp_mymodel"."dt_rng" && DateTimeTZRange(datetime.datetime(2015, 5, 1, 0, 0, tzinfo=<UTC>), datetime.datetime(2015, 6, 1, 0, 0, tzinfo=<UTC>), '[)'))

The expected output is numrange(1.0, 5.0), daterange('2015-05-01', '2015-06-01') and tstzrange('2015-05-01 00:00:00+00:00', '2015-06-01 00:00:00+00:00') respectively.

Change History (2)

comment:1 by Tim Graham, 9 years ago

Triage Stage: UnreviewedAccepted
Type: UncategorizedBug

comment:2 by Villiers Strauss, 9 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top