django-filter - map query parameter to field name

2.1k Views Asked by At

I'm using the Django's default user and a REST API endpoint to list users filtered by query parameters. It looks like this:

# serializers.py
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

# views.py
class UserFilter(django_filters.FilterSet):
    class Meta:
        model = User


class UserList(generics.ListAPIView):
    model = User
    serializer_class = UserSerializer
    filter_class = UserFilter

This works good as long as I provide User's field name in query parameter. So, if I want to filter users based on username, I would use /users/?username=johndoe. But what if I want to map a query parameter which is not a field in User model? Let's say, I have a query param called nickname and I want to use it to filter on first_name field?

Using URLConf and named group might be a solution but if I do it for 15 fields then it'll be very long.

What's the better way?

1

There are 1 best solutions below

1
On BEST ANSWER

You can add nickname to your FilterSet pointing to actual field on the model.

# views.py
class UserFilter(django_filters.FilterSet):
    nickname = django_filters.CharFilter(name='first_name')
    class Meta:
        model = User