Use & and = on psycopg2 range types.
pip install psycopg2-range-overlaps==1.0.1
This module overrides the Range.__and__ function, so that it returns a boolean value based on if the two objects overlap.
The rationale behind this is that it mirrors the range && range operator in postgres:
>>> DateRange(None, b) & DateRange(b, None) False >>> DateRange(None, None) & DateRange(a, b) True
There is also an improved equality operator, and a function for normalising ranges (if possible).