Как разрешить 'filter' параметр запроса Django REST Framework JSON API?
Я использую Django REST Framework с djangorestframework-jsonapi
Когда я делаю запрос с помощью filter[name]=THEOS
DRF выдает ошибку в браузере.
Я попытался сделать запрос с помощью этого URL
http://localhost:8000/api/space_objects/?filter[name]=THEOS
Другой параметр из JSON API я могу использовать без проблем.
ValidationError at /api/space_objects/
[ErrorDetail(string='invalid filter[name]', code='invalid')]
А это мои настройки DRF JSON API DRF JSON API Documentation
REST_FRAMEWORK = {
'PAGE_SIZE': 10,
'EXCEPTION_HANDLER': 'rest_framework_json_api.exceptions.exception_handler',
'DEFAULT_PAGINATION_CLASS':
'rest_framework_json_api.pagination.JsonApiPageNumberPagination',
'DEFAULT_PARSER_CLASSES': (
'rest_framework_json_api.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework_json_api.renderers.JSONRenderer',
# If you're performance testing, you will want to use the browseable API
# without forms, as the forms can generate their own queries.
# If performance testing, enable:
# 'example.utils.BrowsableAPIRendererWithoutForms',
# Otherwise, to play around with the browseable API, enable:
'rest_framework_json_api.renderers.BrowsableAPIRenderer'
),
'DEFAULT_METADATA_CLASS': 'rest_framework_json_api.metadata.JSONAPIMetadata',
'DEFAULT_SCHEMA_CLASS': 'rest_framework_json_api.schemas.openapi.AutoSchema',
'DEFAULT_FILTER_BACKENDS': (
'rest_framework_json_api.filters.QueryParameterValidationFilter',
'rest_framework_json_api.filters.OrderingFilter',
'rest_framework_json_api.django_filters.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
),
'SEARCH_PARAM': 'filter[search]',
'TEST_REQUEST_RENDERER_CLASSES': (
'rest_framework_json_api.renderers.JSONRenderer',
),
'TEST_REQUEST_DEFAULT_FORMAT': 'vnd.api+json'
}
Моя модель
class SpaceObject(models.Model):
class Meta:
ordering = ['norad']
norad = models.IntegerField(primary_key=True)
object_type = models.CharField(max_length=200, null=True)
name = models.CharField(max_length=200, null=True)
period = models.FloatField(null=True)
inclination = models.FloatField(null=True)
apogee = models.FloatField(null=True)
perigee = models.FloatField(null=True)
rcs_size = models.CharField(max_length=200, null=True)
tle_1 = models.CharField(max_length=200, null=True)
tle_2 = models.CharField(max_length=200, null=True)
last_updated = models.DateTimeField(max_length=6, default=timezone.now)
Мой сериализатор
class SpaceObjectSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = SpaceObject
fields = ['norad', 'object_type', 'name', 'period', 'inclination', 'apogee', 'perigee', 'rcs_size', 'tle_1', 'tle_2', 'last_updated']
Я пытался запустить это, но все равно получил проблему
pip install djangorestframework-jsonapi['django-filter']
Есть ли способ решить эту проблему? Я пытаюсь следовать документации, но безуспешно.
Любая помощь будет принята с благодарностью.
Надеюсь, у вас все хорошо. Во-первых, вам нужно убедиться, что у вас установлен Django-Filter. Проверьте это с помощью следующей команды.
pip install 'django-filter'
Далее, добавьте django-filter в INSTALLED_APPS.
INSTALLED_APPS = [
'rest_framework',
'rest_framework_json_api',
'django_filters',
]
Затем в классе View необходимо установить поля и свойства фильтра. Как показано в примере ниже:
class SpaceObjectViewSet(viewsets.ModelViewSet):
queryset = SpaceObject.objects.all()
serializer_class = SpaceObjectSerializer
permission_classes = [permissions.AllowAny]
filterset_fields = {
'name': ('exact', 'icontains', 'iexact', 'contains',),
}
и вы вызываете api для точного фильтра, как показано ниже:
http://localhost:8000/api/space_objects/?filter[name]=THEOS
и призыв к иконам, подобным приведенным ниже:
http://localhost:8000/api/space_objects/?filter[name.icontains]=THEOS
И оставаясь похожими на иконки.