0

My model

class car(models.Model):
    name = models.CharField(max_length=255, unique=True)
    speed = models.CharField(max_length=255)
    age = models.CharField(max_length=255)


    def __str__(self):
        return self.name

My api serializer

class carSerializer(serializers.ModelSerializer):
    class Meta:
        model = car
        fields = ('name', 'speed', 'age')

My list view

class carListView(ListAPIView):
    queryset = car.objects.all()
    serializer_class = carSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('name', 'speed', 'age')

How can I search the model fields name, speed, age via the api link?

Currently, I am able to search a single field using

http://127.0.0.1:8000/api/?name=Toyoto

How can I modify the above link to search multiple fields ? How can I modify the above link to search partial letters rather than exact ?

1 Answer 1

1

You can pass all params like below

http://127.0.0.1:8000/api/?name=Toyoto&speed=90&age=55

using python "requests" package

import requests


params = {'name': 'Toyoto', 'speed': '90', 'age': '95'}
url  = 'http://127.0.0.1:8000/api/'
r = requests.get(url, params)
print(r.json())

for search like "icontains" you can use filterset_class like below

from django_filters import rest_framework as filters
from .models import car


class CarFilter(filters.FilterSet):
    name = filters.CharFilter(field_name="name", lookup_expr='icontains')
    speed = filters.CharFilter(field_name="speed", lookup_expr='icontains')
    age = filters.CharFilter(field_name="age", lookup_expr='icontains')

    class Meta:
        model = car
        fields = ('name', 'speed', 'age')

class carListView(ListAPIView):
    queryset = car.objects.all()
    serializer_class = carSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_class = CarFilter
Sign up to request clarification or add additional context in comments.

1 Comment

how can I change it to accept partial names and not sensitive to cap instead of full and exact as in, 127.0.0.1:8000/api/?name=to

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.