I need to filter API response based on URL parameters that both exact match and also the substring of the parameter matches in Django. The API call would be : "http://127.0.0.1:8000/showjoineduserdata?phonenumber=3349279_copy&firstname=Olivier_copy"

**models.py**
from django.db import models
    
class Joineduserdatanew(models.Model):
surname = models.TextField(db_column='Surname', blank=True, null=True)  # Field name made lowercase.
firstname = models.TextField(db_column='Firstname', blank=True, null=True)  # Field name made lowercase.
phonenumber = models.TextField(db_column='PhoneNumber', blank=True, null=True)  # Field name made lowercase.
email = models.TextField(db_column='Email', blank=True, null=True)  # Field name made lowercase.
login = models.TextField(db_column='Login', blank=True, null=True)  # Field name made lowercase.
racfid = models.TextField(db_column='RACFid', blank=True, null=True)  # Field name made lowercase.
assignee = models.TextField(db_column='Assignee', blank=True, null=True)  # Field name made lowercase.
company_or_group = models.TextField(db_column='Company_or_Group', blank=True, null=True)  # Field name made lowercase.
groupname = models.TextField(db_column='GroupName', blank=True, null=True)  # Field name made lowercase.
admin = models.TextField(db_column='Admin', blank=True, null=True)  # Field name made lowercase.
usertype = models.TextField(db_column='UserType', blank=True, null=True)  # Field name made lowercase.
segid = models.TextField(blank=True, null=True)
roleid = models.IntegerField(blank=True, null=True)
segment = models.TextField(blank=True, null=True)
role = models.TextField(blank=True, null=True)
sno = models.AutoField(primary_key=True)

class Meta:
    managed = False
    db_table = 'joineduserdatanew'



**serialize.py**
from dataclasses import field
from rest_framework import serializer
from usersearch_api.models import Joineduserdatanew

class JoineduserdatanewSerialization(serializers.ModelSerializer):
class Meta:
    model=Joineduserdatanew
    fields=('surname','firstname','phonenumber','email','login','racfid','assignee','company_or_group','groupname','segment','role','admin','usertype')

**views.py**
from usersearch_api.serialization import JoineduserdatanewSerialization
from rest_framework.response import Response
from rest_framework.decorators import api_view
from usersearch_api.models import Joineduserdatanew
from rest_framework.generics import ListAPIView
from rest_framework.viewsets import ModelViewSet

class UserSearchAPIView(ListAPIView):
serializer_class=JoineduserdatanewSerialization
queryset=Joineduserdatanew.objects.all()
#filter_class = UserDataFilter
filter_backends = [DjangoFilterBackend]
filterset_fields = ['surname','firstname','login','racfid','assignee','phonenumber','company_or_group','email','segment']
2

There are 2 best solutions below

1
On
please install django-filter library, for installation follow this procedure
https://django-filter.readthedocs.io/en/stable/guide/install.html
import django_filters

class PostFilter(django_filters.FilterSet):
    
    class Meta:
        model = Post
        fields = {
            'title': ["exact"], # for exact match
            "desc" : ["contains"] # partial match
            # similarly you can add your new fields with filtering condition...
        }

class PostList(ListAPIView):
    queryset = Post.objects.all() 
    serializer_class = PostSerializer
    filter_backends = [DjangoFilterBackend]
    filter_class = PostFilter
1
On
class UserSearchFilterAPIView(APIView):
def get(self,request,*args,**kargs):
    queryset=Joineduserdatanew.objects.all()
    
    #Custom filter
    
    surname=self.request.query_params.get('surname',None)
    firstname=self.request.query_params.get('firstname',None)
    login=self.request.query_params.get('login',None)
    racfid=self.request.query_params.get('racfid',None)
    assignee=self.request.query_params.get('assignee',None)
    phonenumber=self.request.query_params.get('phonenumber',None)
    company_or_group=self.request.query_params.get('company_or_group',None)
    email=self.request.query_params.get('email',None)
    segment=self.request.query_params.get('segment',None)
    if surname:
        queryset=queryset.filter(surname__icontains=surname)
    if firstname:
        queryset=queryset.filter(firstname__icontains=firstname)
    if login:
        queryset=queryset.filter(login__icontains=login)
    if racfid:
        queryset=queryset.filter(racfid__icontains=racfid)
    if assignee:
        queryset=queryset.filter(assignee__icontains=assignee)
    if phonenumber:
        queryset=queryset.filter(phonenumber__icontains=phonenumber)
    if company_or_group:
        queryset=queryset.filter(company_or_group__icontains=company_or_group)
    if email:
        queryset=queryset.filter(email__icontains=email)
    if segment:
        queryset=queryset.filter(segment__icontains=segment)
        
    serializer=JoineduserdatanewSerialization(queryset,many=True)
    return Response(serializer.data)

Here the necessary fields are got and on each of them filters are applied, so if the API endpoint contains at least any of the parameters it filters based on it, and multiple parameters are added as 'and'.This is how I filtered the API response as needed.