Code

Opened 3 years ago

Last modified 2 weeks ago

#16487 new Bug

F expression with timedelta does not work with __range query filter

Reported by: bendavis78 Owned by: nobody
Component: Database layer (models, ORM) Version: 1.3
Severity: Normal Keywords:
Cc: bendavis78 Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Works:

User.objects.filter(last_login__gt=F('date_joined')+timedelta(weeks=2))

Doesn't work:

User.objects.filter(last_login__range=(F('date_joined'), F('date_joined')+timedelta(weeks=2)))

Attachments (0)

Change History (3)

comment:1 Changed 3 years ago by aaugustin

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Triage Stage changed from Unreviewed to Accepted

Indeed. Here's the traceback:

>>> from datetime import timedelta
>>> from django.contrib.auth.models import *
>>> from django.db.models import F
>>> User.objects.filter(last_login__gt=F('date_joined')+timedelta(weeks=2))
[<User: admin>]
>>> User.objects.filter(last_login__range=(F('date_joined'), F('date_joined')+timedelta(weeks=2)))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/manager.py", line 141, in filter
    return self.get_query_set().filter(*args, **kwargs)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/query.py", line 550, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1172, in add_q
    can_reuse=used_aliases, force_having=force_having)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1107, in add_filter
    connector)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/sql/where.py", line 67, in add
    value = obj.prepare(lookup_type, value)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/sql/where.py", line 316, in prepare
    return self.field.get_prep_lookup(lookup_type, value)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/fields/__init__.py", line 644, in get_prep_lookup
    return super(DateField, self).get_prep_lookup(lookup_type, value)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/fields/__init__.py", line 294, in get_prep_lookup
    return [self.get_prep_value(v) for v in value]
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/fields/__init__.py", line 721, in get_prep_value
    return self.to_python(value)
  File "path/to/venv/lib/python2.6/site-packages/django/db/models/fields/__init__.py", line 710, in to_python
    raise exceptions.ValidationError(self.error_messages['invalid'])
ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.']

comment:2 Changed 2 years ago by anonymous

This should be supported. most databases these days either have support for time intervals or time math.

comment:3 Changed 2 weeks ago by bendavis78

  • Cc bendavis78 added

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as new
The owner will be changed from nobody to anonymous. Next status will be 'assigned'
as The resolution will be set. Next status will be 'closed'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.