diff options
| author | Marc Tamlyn <marc.tamlyn@gmail.com> | 2015-05-21 20:55:50 +0930 |
|---|---|---|
| committer | Marc Tamlyn <marc.tamlyn@gmail.com> | 2015-06-04 19:29:59 +0100 |
| commit | 7bda2d8ebc7833747363ac837fecb6535c817dcd (patch) | |
| tree | 3f4cc63e0a8420a9da9a5b9e5e52bcbe92ce811b /django/contrib/postgres/fields | |
| parent | 5987b3c46d5a6948737627d294d95ed54d49eae6 (diff) | |
Fixed #24837 -- field__contained_by=Range
Provide `contained_by` lookups for the equivalent single valued fields
related to the range field types. This acts as the opposite direction to
rangefield__contains.
With thanks to schinckel for the idea and initial tests.
Diffstat (limited to 'django/contrib/postgres/fields')
| -rw-r--r-- | django/contrib/postgres/fields/ranges.py | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/django/contrib/postgres/fields/ranges.py b/django/contrib/postgres/fields/ranges.py index 679e87f44e..6e0f8e2284 100644 --- a/django/contrib/postgres/fields/ranges.py +++ b/django/contrib/postgres/fields/ranges.py @@ -98,6 +98,38 @@ RangeField.register_lookup(lookups.ContainedBy) RangeField.register_lookup(lookups.Overlap) +class RangeContainedBy(models.Lookup): + lookup_name = 'contained_by' + type_mapping = { + 'integer': 'int4range', + 'bigint': 'int8range', + 'double precision': 'numrange', + 'date': 'daterange', + 'timestamp with time zone': 'tstzrange', + } + + def as_sql(self, qn, connection): + field = self.lhs.output_field + if isinstance(field, models.FloatField): + sql = '%s::numeric <@ %s::{}'.format(self.type_mapping[field.db_type(connection)]) + else: + sql = '%s <@ %s::{}'.format(self.type_mapping[field.db_type(connection)]) + lhs, lhs_params = self.process_lhs(qn, connection) + rhs, rhs_params = self.process_rhs(qn, connection) + params = lhs_params + rhs_params + return sql % (lhs, rhs), params + + def get_prep_lookup(self): + return RangeField().get_prep_lookup(self.lookup_name, self.rhs) + + +models.DateField.register_lookup(RangeContainedBy) +models.DateTimeField.register_lookup(RangeContainedBy) +models.IntegerField.register_lookup(RangeContainedBy) +models.BigIntegerField.register_lookup(RangeContainedBy) +models.FloatField.register_lookup(RangeContainedBy) + + @RangeField.register_lookup class FullyLessThan(lookups.PostgresSimpleLookup): lookup_name = 'fully_lt' |
