'filter API response based on URL parameters that both exactly matches and also the substring of the parameter matches in Django
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']
Solution 1:[1]
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
Solution 2:[2]
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.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | NANDHA KUMAR |
| Solution 2 |
