Opened 3 weeks ago

Last modified 3 weeks ago

#28851 new New feature

Support Open Ranges for Range Lookup - convert None to 'infinity'

Reported by: Sven R. Kunze Owned by: nobody
Component: Database layer (models, ORM) Version: 1.11
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Hi Dev Team,

we recently came across the following issue. We wanted to search for an open ranges using the range lookup.

Model.objects.filter(date__range=(None, now()))
Model.objects.filter(date__range=(now(), None))

Right now, we monkey-patch Django like this:

from django.db.models.lookups import Range

class OpenRange(Range):
    lookup_name = 'range'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        if not rhs_params[0]:
            rhs_params[0] = '-infinity'
        if not rhs_params[1]:
            rhs_params[1] = 'infinity'
        return "%s BETWEEN %s AND %s" % (lhs, rhs[0], rhs[1]), rhs_params

models.DateField.register_lookup(OpenRange)

Cheers,
Sven

Change History (1)

comment:1 Changed 3 weeks ago by Simon Charette

Any reason why you can't use date__gte and date__lte?

In order to accept this we'd have to make sure all the supported database engines are able to use open ranges (is infity supported for all datatypes?) and whether or not these engines will be smart enough to use an index if this value is used. For these reasons I'm -0 on adding this as it doesn't seem to bring benefits over the existing lt, gt and friends lookups.

Note: See TracTickets for help on using tickets.
Back to Top