Как сделать простую фильтрацию с помощью 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