I have DRF custom filter and I'm struggling with building query for NumericRange
.
I need to create NumericRange
(or other range for integers) with two calculated values and then use that field to filter it using __overlap
.
def filter_range(queryset, name, value):
queryset = queryset.annotate(
number_range=ExpressionWrapper(
NumericRange(F(f"{name}_base"), F(f"{name}_base") + F(f"{name}_extend")),
output_field=NumericRange(),
),
).filter(number_range__overlap=(value.start, value.stop))
When I use this filter, I'm getting:
'NumericRange' object has no attribute 'resolve_expression'
I think that maybe I'm using the wrong range field or something but I couldn't find anything better.
SOLUTION
I found a solution and I just used Func with NUMRANGE
taken from Postgres documentation
def filter_range(queryset, name, value):
queryset = queryset.annotate(
number_range=Func(
F(f"{name}_base"),
F(f"{name}_base") + F(f"{name}_extend"),
function="NUMRANGE",
output_field=RangeField(),
),
).filter(number_range__overlap=NumericRange(value.start, value.stop))