1

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))
Janosz
  • 21
  • 2

0 Answers0