首页 > 解决方案 > 将多个字段传递给 django rest framework api

问题描述

我的模型

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

我的 api 序列化器

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

我的列表视图

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

如何通过 api 链接搜索name模型字段speedage

目前,我可以使用搜索单个字段

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

如何修改上述链接以搜索多个字段?如何修改上述链接以搜索部分字母而不是精确?

标签: djangodjango-rest-framework

解决方案


你可以params像下面一样通过

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

使用python“请求”包

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())

对于像“icontains”这样的搜索,你可以filterset_class像下面这样使用

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

推荐阅读