summaryrefslogtreecommitdiff
path: root/django/contrib/postgres/fields
diff options
context:
space:
mode:
authorMarc Tamlyn <marc.tamlyn@gmail.com>2015-05-21 20:55:50 +0930
committerMarc Tamlyn <marc.tamlyn@gmail.com>2015-06-04 19:29:59 +0100
commit7bda2d8ebc7833747363ac837fecb6535c817dcd (patch)
tree3f4cc63e0a8420a9da9a5b9e5e52bcbe92ce811b /django/contrib/postgres/fields
parent5987b3c46d5a6948737627d294d95ed54d49eae6 (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.py32
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'