How to filter a comma separated string in Django Rest Framework?

Viewed 1335

I have some data that is similar to this:

position: "1B, 2B, 3B, SS"

I'd like to be able to run a query such as /players/?position=1B, however, this currently does not return anything because the items are separated by a comma.

Here is stripped down version of the views.py:

class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
    pass

class PlayerProfileFilter(django_filters.FilterSet):
    position = CharInFilter(field_name='display_position', lookup_expr='in')

Is there a way to filter the data in this way?

2 Answers

You probably want to use a custom filter.

from django.db.models import Q

import django_filters


class PlayerProfileFilter(django_filters.FilterSet):
    position = django_filters.CharFilter(method="my_custom_filter")

    def my_custom_filter(self, queryset, name, value):
        query = Q()
        for position in value.split(","):
            query |= Q(position__contains=position)
        return queryset.filter(query)

I would suggest to create a custom filter class.

You can use something from django-rest-framework

from rest_framework import filters

class MyFilter(filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # logic here
        return queryset

Or filter django-filters

from django_filters.filters import Filter

class MyFilter(Filter):
    def filterself, request, queryset, view):
        # logic here
        return queryset
Related