Как сделать простую фильтрацию с помощью django-filter

Я столкнулся с проблемой. У меня есть простой drf проект с приложением разрешения на въезд автомобилей.

views.py `

class PermitViewSet(ModelViewSet):
    queryset = Permit.objects.filter()
    serializer_class = PermitSerializer
    filter_backends = [DjangoFilterBackend]
    filter_fields = ['car_number']

serializers.py `

class PermitSerializer(serializers.ModelSerializer):
    class Meta:
        model = Permit
        fields = ['car_number', 'is_active']

models.py `

class Permit(models.Model):
    car_number = models.CharField(max_length=15)
    customer = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)

urls.py

router = SimpleRouter()

router.register(r'permit', PermitViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    
]


urlpatterns += router.urls

`

я набираю текст в браузере http://127.0.0.1:8000/api/v1/permits/?car_number=555

и я получаю полный список автомобилей `

[{"car_number":"555","is_active":true},{"car_number":"666","is_active":true},{"car_number":"777","is_active":true}]

` Не работает, в чем проблема?

Вы указываете поля с помощью filterset_fields атрибута [drf-doc], а не атрибута filter_fields:

class PermitViewSet(ModelViewSet):
    queryset = Permit.objects.all()
    serializer_class = PermitSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['car_number']

Прежде всего, я думаю, что было бы лучше изменить CharField 'car_number' в вашей модели на IntegerField

В случае с API я рекомендую использовать стороннее приложение, например, Django-filter. Например,

pip install django-filter

settings.py

INSTALLED_APPS=[
   .....
   'django-filters'
]
REST_FRAMEWORK={'django_filters.rest_framework.DjangoFilterBackend'}

views.py

from django-filters import rest_framework as filters 

class AAA(filters.FliterSet):
  car_number=filtersNumberFilter(field_name='car_number', lookup_expr=555)
  class Meta:
      model=.....
      fields=[...]

class BBB(ModelViewSet):
  ........
  filter_class=AAA
Вернуться на верх