{{{
>>> 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)))
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))))
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))))
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/24991>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* needs_better_patch: => 0
* stage: Unreviewed => Accepted
* type: Uncategorized => Bug
* needs_tests: => 0
* needs_docs: => 0
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:1>
Old description:
> 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)))
> 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))))
> 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))))
> 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.
New description:
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.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:2>
* owner: => Stranger6667
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:3>
Comment (by Stranger6667):
Based on `psycopg2.extensions.adapt` output it should be converted as:
`NumericRange(1, 5)` to `'[1,5)'`
`DateRange(datetime.date(2015, 5, 1), datetime.date(2015, 6, 1))` to
`daterange('2015-05-01'::date, '2015-06-01'::date, '[)')`
`DateTimeTZRange(datetime.datetime(2015, 5, 1, tzinfo=utc),
datetime.datetime(2015, 6, 1, tzinfo=utc))` to
`tstzrange('2015-05-01T00:00:00+00:00'::timestamptz,
'2015-06-01T00:00:00+00:00'::timestamptz, '[)')`
Please correct me if I'm wrong. If it is true, then I'll try to provide PR
for that.
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:4>
Comment (by unklphil):
Replying to [comment:4 Stranger6667]:
> Based on `psycopg2.extensions.adapt` output it should be converted as:
> `NumericRange(1, 5)` to `'[1,5)'`
> `DateRange(datetime.date(2015, 5, 1), datetime.date(2015, 6, 1))` to
`daterange('2015-05-01'::date, '2015-06-01'::date, '[)')`
> `DateTimeTZRange(datetime.datetime(2015, 5, 1, tzinfo=utc),
datetime.datetime(2015, 6, 1, tzinfo=utc))` to
`tstzrange('2015-05-01T00:00:00+00:00'::timestamptz,
'2015-06-01T00:00:00+00:00'::timestamptz, '[)')`
>
> Please correct me if I'm wrong. If it is true, then I'll try to provide
PR for that.
That looks right. The output should ideally be exactly what gets executed
in the database, to make debugging easier.
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:5>
* has_patch: 0 => 1
Comment:
Looks like #25705 provides a patch for this issue.
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:6>
* needs_better_patch: 0 => 1
Comment:
Created [https://github.com/django/django/pull/5848 a pull request] with
the patch from #25705 but there are some test failures.
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:7>
* needs_better_patch: 1 => 0
Comment:
I tried to fix errors in [https://github.com/django/django/pull/12156 that
PR]. I'm not very proud of those regex testing, but well, it works...
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:8>
* needs_better_patch: 0 => 1
* version: 1.8 => master
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:9>
* status: assigned => closed
* resolution: => duplicate
Comment:
Duplicate of #25705.
--
Ticket URL: <https://code.djangoproject.com/ticket/24991#comment:10>