summaryrefslogtreecommitdiff
path: root/django/contrib/postgres/fields
diff options
context:
space:
mode:
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'